-
分组
分组就是对正则表达式进行用“()”分割后命名,便于后续的操作,例如:(\d{1,3}.){3}\d{1,3}简单匹配IP。
默认的分组命名方式是:整个正则表达式为分组0,从左到右分组为1、2、3以此类推。也可以自己进行命名,例如:(?<Word>\w+)或者(?"Word"\w+)。
常用分组语法1、捕获
代码 | 描述 |
---|---|
(exp) | 匹配exp,并捕获文本到自动命名的组内 |
(?<name>exp) | 匹配exp,并捕获文本到name的组里面,尖括号可以换成'' |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
2、零宽断言
代码 | 描述 |
---|---|
(?=exp) | 匹配exp前面的位置(顺序肯定环视) |
(?<=exp) | 匹配exp后面的位置(逆序肯定环视) |
(?!exp) | 匹配后面跟的不是exp的位置(顺序否定环视) |
(?<!exp) | 匹配前面不是exp的位置(逆序否定环视) |
3、注释
代码 | 描述 |
---|---|
(?#comment) | 提供注释阅读,不对正则产生影响 |
反向引用
用于重复搜索前面某个分组匹配的文本。如:匹配"This is a 'string'"
里面的双引号里的内容"This is a 'string'"
,可以这么写:(\"|').*?(\"|')
,但此时匹配的却是"This is a '
,这是因为|
分支的特性。如果采用反向引用:(\"|').*?\1
,或者利用命名捕捉组(即给分组命名,但本人测试没通过,测试代码为(?<name>\"|').*?\k<name>
),就能匹配到"This is a 'string'"
。贪婪/懒惰匹配模式
贪婪:当正则表达式中包含能接受重复的限定符时,匹配尽可能多的字符(默认)
懒惰:当正则表达式中包含能接受重复的限定符时,匹配尽可能少的字符,只需在重复的限定符后面加上?
懒惰限定符:
懒惰限定符代码/语法 | 描述 |
---|---|
*? | 重复0次或更多次,但尽可能的少重复 |
+? | 重复一次或更多次,但尽可能的少重复 |
?? | 重复0次或一次,但尽可能的少重复 |
{n,}? | 重复n次或更多次,但尽可能的少重复 |
{n,m}? | 重复n到m次,但尽可能的少重复 |
注意:实际开发中贪婪与懒惰是比较常用的,使用懒惰模式可以减少回溯,提高效率
正则表达式的运算符优先级
转义符->括号和中括号->限定符->定位点和序列(字符)->替换
正则表达式的常用模式
- 忽略大小写(i)
- 多行模式(m)
- 点号通配模式(s):点号通配换行符
- 懒惰模式(U):相当于前面的
?
- 结尾模式(D):匹配时限定
$
匹配出来的不可有换行 - 支持UTF-8转义表达(u):使表达式支持UTF-8