目录
前言:
本篇接着上一篇博客:正则表达式基础讲,这篇博客的理解难度相较上一篇有提升。所以如果理解不了很正常,自己找下看哪里不理解,针对性的自我补充下。以下文章中"exp" 代表有效的正则表达式。
正文:
1、分组方式
上一篇博客中提到了分组"()"的概念,那么分组方式都有哪些呢?
常见的几种分组方法
分类 | 代表/语法 | 说明 |
捕获
| (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp) | |
(?:exp) | 匹配exp,不捕获匹配文本,也不给分组分配组号 | |
断言
| (?=exp) | 匹配exp前面位置,但是不匹配exp |
(?<exp) | 匹配exp后面位置,但是不匹配exp | |
(?!exp) | 匹配后面的不是exp的位置,但是不匹配exp | |
(?<!exp) | 匹配前面不是exp的位置,但是不匹配exp | |
注释 | (?#comment) | 注释 |
2、分组组号
上一篇博客中提到了分组的概念,那么既然分组组号该如何定那呢?下图中的表达式跟上满的分组对应下。
由上图可以看出组号分配方式:
- 分组0对应整个正则表达式
- 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
- 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.
3、零宽断言和负零宽断言:
零宽断言和负零宽断言与分组(也就是:())分不开。如果你理解了分组,那理解断言就更容易了。
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
3.1 、零宽度断言:
(?=exp):也叫零宽度正预测先行断言,它匹配自身出现的位置前面能匹配表达式exp的。一句话总结就是匹配exp前面的东西
例子:匹配以ing结尾的单词的前面部分(除了ing以外的部分)
(?<=exp):也叫零宽度正回顾断言,匹配自身出现位置前匹配表达式exp的。一句话总结:匹配exp后面的东西。
例子:匹配以re开头的单词的后半部分(除了re以外的部分)
3.2 、负向零宽度断言:
前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:
(?!=exp):零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。一句话总结就是匹配exp前面的东西
例子:匹配三位数字,而且这三位数字的后面不能是数字
(?<!exp):零宽度负回顾断言,断言此位置前面跟的不是exp的位置。
例子:匹配前面不是小写字母的七位数字
4、贪婪与非贪婪
就像断言与分组有关系似的,贪婪与非贪婪与上一篇博客的:重复 有关系
4.1贪婪
贪婪:在整个表达式匹配成功的前提下,尽可能多的匹配
贪婪匹配的限定符如下:
限定符 | 描述 | 模式 | 匹配 |
* | 匹配上一个元素零次或多次 | \d*\.\d | ".0","19.9"和"219.9" |
+ | 匹配上一个元素一次或多次 | "be+" | "been"和"bee","bent"和"be" |
? | 匹配前面的元素零次或一次 | "rai?n" | "ran"和"rain" |
{n} | 匹配上一个元素恰好n次 | ",\d{3}" | "1.043.6"中的.043 |
{n,} | 匹配上一个元素至少n次 | "\d{2,}" | "166","29"和"1930" |
{n,m} | 匹配上一个元素至少n次,但不多于m次 | "\d{3,5}" | "166","16546","132654"中的13265 |
4.2 非贪婪
非贪婪:在整个表达式匹配成功的前提下,尽可能少的匹配。
非贪婪是在贪婪限定符后面多加一个“?”如下:
限定符 | 描述 | 模式 | 匹配 |
*? | 匹配上一个元素零次或多次,但次数尽可能少 | \d*?\.\d | ".0","19.9"和"219.9" |
+? | 匹配上一个元素一次或多次,但次数尽可能少 | "be+?" | "been中的"be",bent"中的"be" |
?? | 匹配上一个元素零次或一次,但次数尽可能少 | "rai??n" | "ran"和"rain" |
{n}? | 匹配前导元素恰好 n 次 | ",\d{3}?" | "1.043.6"中的.043 |
{n,}? | 匹配上一个元素至少 n 次,但次数尽可能少 | "\d{2,}?" | "166","29"和"1930" |
{n,m}? | 匹配上一个元素的次数介于 n 和 m 之间,但次数尽可能少 | "\d{3,5}?" | "166","16546","132654"中的"132","654" |
例子:贪婪
例子:非贪婪
小结:
到这里,最复杂的断言和贪婪非贪婪概念都理解了,如果你都理解了,那真的是太棒了。感谢您的阅读,如果喜欢,记得给小编点赞哦???????????????????????????????????