零宽度正预测先行断言:
(?=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>之间的内容,不包含前后缀本身