正则表达式-零宽断言

时间:2022-09-24 06:20:01

零宽度正预测先行断言:

(?=exp)

仅当子表达式在此位置的右侧匹配时才继续匹配exp。例如,\w+(?=\d)与后跟数字的单词匹配,而不与该数字匹配

经典案例:某单词以ing结尾,匹配ing之前的单词

var reg = new Regex(@"\w+(?=ing)");

var str = "muing";

Console.WriteLine(reg.Match(str).Value)

返回的结果为:=》mu

零宽度正回顾后发断言:

(?<=exp)

断言自身出现的位置的前面能匹配表达式exp

例如:(?<=\bre)\w+\b会匹配以re开头的单词发后半部分(除了re以外的部分),如查找reading  a book时,会匹配ading

负向零宽断言:

确保某个字符没有出现,但并不想去匹配他时

例如:查找某个单词里面含有字母q,但q后面不是字母u这样的单词

\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。后面的[^u]总要匹配一个单词,因此匹配的结果单词q后面不能为结尾,即,单词q后面应该还有除u以外的单词,如匹配整个 Irag fighting

零宽度负预测先行断言(?!exp),断言此位置后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。

零宽度负回顾后发断言(?<!exp)断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的7位数字。

举一个栗子:

(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单html标签内的内容。

(?<=<(\w+)>)制定了带<>的前缀,如<b>或<div>等

.*表任意字符串

(?=<\/\1>)最后一个后缀,\1表示引用的捕获的第一组,与前面的(\w+)匹配的内容,如果前面是<b>的话,就匹配</b>之间的内容,不包含前后缀本身