阅读公众号看到一个练习正则表达式的 Github 项目,果断上去复习了一波,并重新记录一下相关知识。
正则表达式
"正则表达式" - 一组由字母和符号组成的特殊文本,可以用来从文本中找出满足你想要的格式的句子。
元字符
" . " - 句号匹配任意单个字符,除了换行符。
[] - 字符种类,匹配方括号内的任意字符。
[^] - 否定的字符种类,匹配除了方括号内的任意字符。
" * " - 匹配 >=0 个重复的,在 * 号之前的字符。
" + " - 匹配 >= 1 个重复的,在 + 号之前的字符。
" ? " - 标记 ? 之前的字符为可选的,匹配 1 或 0 个。
{n,m} - 匹配 [n,m] 个 大括号之前的字符
a. {n,}
b. {,m}
(xyz) - 字符集,匹配与 xyz 完全相等的字符串。
" | " - 与运算符
" \ " - 转移字符,用于匹配保留字。
" ^ " - 从开始行开始匹配
" & " - 从末端开始匹配
简写字符集
\w - 匹配所有字符(大小写)、数字,等同于 [a-zA-Z0-9_]
\W - 匹配所有非字母数字,等同于 [^\w]
\d - 匹配所有数字,[0-9]
\D - 匹配所有非数字,[^0-9]
\s - 匹配所有空格字符
\S - 匹配所有非空格字符,[^\s]
\f - 匹配一个换页符
\n - 匹配一个换行符
\r - 匹配一个回车符
\t - 匹配一个制表符
\v - 匹配一个垂直制表符
\p - 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符
零宽度断言(前后预查)
"?=" - 正先行断言(存在)
"?!" - 负先行断言(排除)
"?<=" - 正后发断言(存在)
"?<!" - 负后发断言(排除)
"先行断言"和"后发断言"都属于非捕获簇(不捕获"文本",也不针对组合进行"计数"),"匹配的结果"不包含该确定格式(仅作为约束)。
1. 先行断言用于判断所匹配的格式是否在另一个确定的格式之前(确定的格式由"先行断言匹配")
2. 后发断言用于判断所匹配的而是是否在另一个确定的格式之后(确定的格式由后发"断言匹配")
零宽度断言(前后预查)的简单说明:我要从一个字符串中挑出 123.但是这个 123 与众不同,只有和其他字符靠近在一起的 123 (零宽度断言的约束条件)才是我想要的 123。
ps:正、负的关系与 [] 、[^] 的关系一样,匹配或除此之外
如:
1. 我要的 123(匹配格式) 后面(先行断言)靠着 abc(确定格斯),(123)(?=abc)
2. 我要的 123(匹配格式) 前面靠着(后发断言) 456(确定格式),(?<=456)(123)
标志
i - 忽略大小写
g - 全局搜索
m - 多行的: 锚点元字符 ^ $ 工作范围在每行的起始
贪婪匹配与惰性匹配
正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式。
贪婪 => 惰性 = "/(.*at)/" => "/(.*?at)/"