-
分组
分组就是对正则表达式进行用“()”分割后命名,便于后续的操作,例如:(\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