<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中并不支持这种后行断言。
那如果在javascript中我们想将“<div>”和“</div>”中的“>”替换成“>”,但是不影响“<br>”中的“>”,那怎么写呢,先看代码:
var s = "<div>line1</div> <br>"; var r = /(<br)?>/g; s.replace(r,function($0,$1) { return $1?"":">";});这里用到了replace函数的第二个参数,这个参数可以是一个值,也可以是一个函数,这个函数需要返回一个用于替换匹配结果的字符串,所以我们就可以利用这个函数的处理功能处理匹配到的结果,上面这个语句的意思就是使用“r”来匹配“s”,匹配之后“$0”中保存匹配到的完整结果,“$1”中匹配到“<br”,函数处理的结果就使,如果“$1”有值(表示“>”前面有“<br”),则返回一个空字符串(也就使不替换),如果“$1”没有值(表示“>”前面没有“<br”),则使用“>”替换。 原文链接:https://www.f2er.com/regex/362154.html