以非贪婪模式,匹配一断由首尾包起来的文本:
首(.*?)尾
那么,怎么再给括号内匹配的文本加首尾限制呢?比如,一定要M开头,Z结尾?答案是使用零宽断言:
首(?=[Mm])(.*?)(?=<[Zz])尾
解释:
首(零宽断言1,指向中间括号内→)(组#1表达式)(←零宽断言2,指向中间括号内)尾
括号包起来的,组#1仍然是组#1,而组#0代表首……尾
的全部内容。
零宽断言组成部分:
-
( ?
括号问号,开启零宽断言 -
(?<
小于号,代表限制断言左←边的字符,不加,则默认代表限制右边的字符。 -
(?<=
等于号,代表是,筛选得与断言相匹配的结果。 -
(?<!
感叹号,代表非,剔除掉与断言相匹配的结果。 -
(?<!表达式)
断言的正则表达式。
最后来一个好玩的“套娃”,零宽断言中套零宽断言!
匹配双引号括起来的文本,其中双引号前不能是斜杠\
,除非斜杠前还是斜杆:
".*?(?<!((?<![\\])[\\]))"
( 简便起见只限制第二个双引号。)
拆解:
-
".*?"
匹配文本 -
".*?(?<![\\])"
限制第二个双引号前,不能是[\\]
-
[\\] --->((?<![\\])[\\]))
在断言的正则表达式中再次嵌套零宽断言 -
".*?(?<! ((?<![\\])[\\])) "
网友评论