如果多个贪婪量词叠加在一起,如果字符串能满足他们各自最大程度的匹配时,就互不干扰,但如果不能满足时,会根据深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配。
懒惰懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配。特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依此循环(读入字符、匹配)直到匹配成功或者把字符串的字符匹配完为止。
使用懒惰量词就是在贪婪量词后面中加?,对于之前的例子,他会匹配成51 35 84 54 56
拓展 零宽断言零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧: 断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
非常抽象而且笼统,对吧,事实上我也那么觉得,以上内容来自百度百科,因为我实在是很难解释这个东西,你可以理解为匹配不含正则结果的内容吧。
正向先行断言(正前瞻)正前瞻的语法为:
//pattern为正则式 (?=pattern)它用于匹配pattern表达式之前的内容,并不返回本身。感觉还是很奇怪对吧,举一个例子:今年我市GDP为5600亿元。假设你要将这句话中的5600取出来,你使用正前瞻的方式应该怎么做?
\d+(?=亿元) 正向后行断言(正后顾):正后顾的语法为:
//pattern为正则式 (?<=pattern)与正前瞻相反,他是返回pattern之后的内容,如果继续实现之前的内容,那么表达式就会变成
(<=今年我市GDP为)\d+ 负向先行断言(负前瞻)负前瞻的语法为:
//pattern为正则式 (?!pattern)匹配非pattern表达式的前面内容,不返回本身。还是举之前的例子,我要找到5600亿元之前的字母,那么可以是
[A-Z]+(?!5600亿元) 负向后行断言(负后顾)这个想必我不需要进行讲解各位也应当能思考出如何书写及使用了,他的语法类似的是:
//pattern为正则式 (?<!pattern)作用当然是匹配非pattern之后的内容。
我在这里就举这几个例子,还有一些很好的使用手册你可以参考Microsoft Documents。
捕获与非捕获捕获你可以理解为将表达式按组分配,例如你匹配一个电话010-8511561,010是区号,我们有可能利用正则式将它单独取出来。
数字编号捕获组语法就是我们之前的分组,但是匹配这个电话号码的时候,他的表达式如果是
((\d{3})-(\d{7}))那么他会分为三组,第一组是完整的电话,第二组是我们的区号,第三组是我们的电话号码。
命名编号捕获组语法:
(?<name>exp)这个name就是你自己自定义的,例如之前的我们可以写成
(?<quhao>\d{3})-(?<haoma>\d{7})这样我们可以通过名称进行访问组内数据,具体的使用我会在后面进行讲解。
非捕获组同之前相反,它用于表示不需要分组的数据
(?:exp)例如我们不需要区号,那么正则式就变成了
(?:\d{3})-(\d{7}) 反向引用捕获会返回一个捕获组,这个分组是保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。
同样的,根据捕获组命名规则,反向引用也有两种
1- 数字反向引用:\k或\number
2- 命名反向引用:\k或'name'
反向引用通常和捕获组是一同使用的,它的作用主要是用来查找一些重复的内容或者做替换指定字符。比如要查找一串字母"aabbbbgbddesddfiid"里成对的字母。
我们捋捋思路:
首先我们要有一个匹配字母的捕获组:(\w)
然后(\w)\1
这样就可以了,\1代表的是1分组,这样就是一个匹配成对字母的正则式了。
如何使用正则表达式位于 System.Text.RegularExpressions 空间下的 Regex 可以对正则表达式进行处理。
Match这是匹配结果的对象,内含这几个常用的属性及方法
Value:匹配值
Groups:分组
Index:匹配值的第一个字符的索引
Success:是否符合正则式
NextMatch:下一个符合的匹配值
Regex.Matches 匹配多个符合的结果,返回一个MatchCollection数组,使用foreach并转换成Match对象进行访问.IsMatch:是否符合正则式
Replace:替换匹配上正则式的字符串
Split:按匹配上的字符串进行分割
Match:返回第一个符合正则式的字符串
Matches:返回所有符合的字符串
Reference老刘
如果我的文章帮助了您,请您在github.NETCoreGuide项目帮我点一个star,在博客园中点一个关注和推荐。