正则表达式之零宽断言
所谓零宽断言:断言指必须能满足一定条件,零宽指没有宽度(指的是不包括满足这个条件的字符)。
字符串:i am a string ! yes ,you're just a stupid string!!
1:现在我想匹配第一个!后面的句子,但不包括!,则表达式为:(?<=!).+$ 其中(?<=!)表示匹配的字符串前面必须要有一个!,但不包括这个!。
2:现在如果我想匹配yes前面的句子,但不包括yes,则表达式为:.+(?=yes) 其中(?=yes)表示匹配的字符串后面必须要有一个yes,但不包括这个yes。
3:现在如果我想匹配包含字母i的单词,但i前面不能有r,也就是我还想匹配stupid这个单词,则表达式为:\b\w*(?<!r)i\w*\b 其中(?<!r)表示匹配的字符串前面必须没有r。
4:现在如果我想匹配以st开始的单词,但st后面不能跟r,也就是我想匹配stupid这个单词,则表达式为:\bst(?!r)\w*\b 其中(?!r)表示匹配的字符串后面必须没有r。
最后总结一个4种情况:
1.前面必须有(零宽度正回顾后发断言),2.后面必须有(零宽度正预测先行断言),3.前面必须没有(零宽度负回顾后发断言),4.后面必须没有(零宽度负预测先行断言)。括号中的是比较难听的名字。
再总结表达式:()表示这个条件,(?)中的?表示这是一个零宽断言(其实是一个非捕获组);(?<)中的<表示这个断言条件是在前面,没有则表示后面;(?<=)中的=表示存在;(?<!)中的!表示不存在;(?<=exp)中的exp就是这个条件的表达式。
所以4种情况为:
1.(?<=exp)前面必须存在exp这个条件。
2.(?=exp)后面必须存在exp这个条件。
3.(?<!exp)前面必须不存在exp这个条件。
4.(?!exp)后面必须不存在exp这个条件。

浙公网安备 33010602011771号