比如我们要匹配下面这个语句中的“<”后面不是“br>”的“<”:
<div>line1</div> <br>
这个正则表达式这么写:
/<(?!br>)/
如果我们只匹配后面为“br>”的“<”呢,正则表达式这么写:
/<(?=br>)/
这两种语法在正则表达式中称之为:
- (?=pattern) 零宽正向先行断言
- (?!pattern) 零宽负向先行断言
断言的意思是判断是否满足,零宽的意思是它只匹配一个位置,如同^匹配开头,$匹配末尾一样,只是一个位置,不返回匹配到的字符,正向表示需要满足pattern,负向表示不能满足pattern,先行表示这个断言语句现在期望返回的匹配字符的后面。
我们在来假设一个需求,如果我要匹配不在“<br>
”中的“>
”,也就是说只匹配“<div>
”、“</div>
”中的“>
”,而不匹配“<br>
”中的“>
”,那么要写的正则表达式就是“匹配前面没有’<br
‘的’>
‘”,写法如下:
/(?<!<br)>/
对应的如果只匹配“<br>
”中的“>
”,而不匹配“<div>
”或者“</div>
”中的“>
”,就这么写:
/(?<=<br)>/
这两种语法在正则表达式中称之为:
- (?
<
=pattern) 零宽正向后行断言 - (?
<
!pattern) 零宽负向后行断言
与先行断言的意思一样,只不过后行断言写在需要匹配的字符的前面,表示如果前面的字符满足pattern就返回。
但是很遗憾的是javascript中并不支持这种后行断言。