正则表达式 - 语法
一、懒惰限定符
1."*?" 重复任意次,但尽可能少重复
如 "acbacb" 正则 "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符
2. "+?" 重复1次或更多次,但尽可能少重复
3."??" 重复0次或1次,但尽可能少重复
4."{n,m}?" 重复n到m次,但尽可能少重复
5."{n,}?" 重复n次以上,但尽可能少重复
二、分组
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
正则表达式的限定符有:
字符 | 描述 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
这个只能对单个字符进行重复,如果我们想对多个字符进行重复怎么办?
此时我们就要用到分组,我们可以使用小括号"()"来指定要重复的子表达式,然后对这个子表达式进行重复
例如:(abc)+ (abc){2,4}
三、捕获分组
为了了解捕获组的含义,咱们举个例子:查询两个相同的0-9数字
"\1"就是引用第一个()里的内容
捕获组可以通过从左到右计算其开括号来编号 。例如,在表达式(A(B(C)) 中,存在四个这样的组:
番号 | 括号 | 引用方式 |
1 | (A) | \1 |
2 | (B(C)) | \2 |
3 | (C) | \3 |
当然如果你不想用\1 2 3这种数字来反向引用,也可以起别名:
(?<捕获组名称>pattern)\k<捕获组名称>——用名称来引用
(?'捕获组名称'pattern)\k'捕获组名称'——用名称来引用
上面两种写法都可以
(?<yu>[0-9])\k<yu>:查找两个相同的数字
四、零宽断言(正向预查)
查找符合条件的匹配时,后面必须得符合pattern
正向匹配: (?=pattern)
正向不匹配: (?!pattern)
举例:查找后面紧跟着b的a
五、零宽断言(反向预查)
查找符合条件的匹配时,前面必须得符合pattern
反向匹配: (?<=pattern)
反向不匹配: (?<!pattern)
查找前面是b的c:
六、模式修饰符
(?i) 开启不区分大小写匹配
(?-i) 关闭不区分大小写匹配
(?s) 即Singleline(单行模式)。表示更改“.”的含义,使它与每一个字符匹配(包括换行符\n)。
(?m) 即Multiline(多行模式) 。表示更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(精确含意:匹配\n之前的位置以及字符串结束前的位置。)
(?x):表示如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
注意:不带有 - 的是开标志,带有 - 的是关标志
七、侵占
量 词 种 类 | 意 义 | ||
贪婪 | 勉强 | 侵占 | |
|
|
| 匹配 X 零次或一次 |
|
|
| 匹配 X 零次或多次 |
|
|
| 匹配 X 一次或多次 |
|
|
| 匹配 X n 次(这个应该不存在这几种模式,就是固定匹配n个) |
|
|
| 匹配 X 至少 n 次 |
|
|
| 匹配 X 至少 n 次,但不多于 m 次 |