————————————————

(?=pattern):正向先行断言,表示匹配位置后面必须紧跟着满足 pattern 的字符串,但不包括这个字符串在匹配结果中。

(?!pattern):负向先行断言,表示匹配位置后面不能紧跟着满足 pattern 的字符串,也不包括这个字符串在匹配结果中。

(?<=pattern):正向后行断言,表示匹配位置前面必须是满足 pattern 的字符串,但不包括这个字符串在匹配结果中。

(?<!pattern):负向后行断言,表示匹配位置前面不能是满足 pattern 的字符串,也不包括这个字符串在匹配结果中。

(?:pattern):非捕获型分组,表示将 pattern 包含在一个分组中,但不把这个分组的匹配结果保存到分组编号中。这个分组通常用于表示可选的或重复的子表达式,或者是限制量词的作用范围,而不需要把它们的匹配结果单独提取出来。

————————————————

正则表达式的几种断言理解起来看着简单而且有点枯燥,在线用工具测试时不像程序那样提示错误在哪里,自己盲目测试会浪费大量时间。

简单场景(单词内字母):

^(?=a$) --- ba       匹配---目标后面跟着的等于这个

^(?<=a)b$ --- ab   匹配---目标前面以这个开头

^b(?!a)$ --- bb      匹配---目标后面跟着的不是这个  --反选

^b(?<!a)$ --- bb    匹配---目标后面跟着的不是这个 

实际应用(行内关键字):

^(.*)(?=linkUp$)               匹配---后面以linkUp结尾的行   (匹配后结果再exclue “linkUp”)

(?<=linkUp)(.*)[^\n]$       匹配---前面以这个开头的行       (匹配后结果再exclue “linkUp”)

^(?!linkUp)(.*)$                匹配---前面不以linkUp开头的行  --反选

^(.*)(?<!linkUp)$              匹配---后面不以linkUp结尾的行 

测试零宽断言时不要太依赖免费的正则工具或网站,有些js不支持负向断言,多换几个试试