Regex前瞻性问题及改进



现在我使用下面的regex跳过{% ... %} 之间的所有内容

(\|.|*|/|-|)|+|$|||[|]|(|^|?|!|~|`)(?![^{%]*?%})

然而,这有时不能正常工作,因为当我有文本时:

"This is test. ! {%.?{1}.%} .  and it doesn't work"

它断开了,还匹配了{% %}区域中的点,这是我不想要的。CCD_ 3和CCD_。负先行应该查找{%字符串,而不是单个字符{}

应跳过{% ... %}之间的所有内容。

知道吗?

查看您的正则表达式,我发现您犯了一些我要指出的错误。

1-(?![^{%]*?%})在简单的单词中并不意味着所有东西,而是在{%.%}之间。您使用了一个字符集[^{%],意思是{OR%,而不是{%。因此,它所说的是:以前不是的字符之一(后面跟着除{%之外的零个或多个字符,并以%}结尾)

换句话说,你可以把它写成(?!%}),这就是为什么除了%}之前的.之外,这些特殊字符是匹配的:

"This is test. ! {%.?{1}.%} .  and it doesn't work"
                        ^

2-所以您不应该只检查{%,而是同时检查两者。但是,当我看到您的正则表达式时,您只能检查%:(?![^%]*?%})。但如果您的输入字符串中有以下内容,它将失败:

"This is test.%} ! {%.%?{1}.%} .  and it doesn't work"
                     ^

还捕获了指向dot

3-一个好的解决方案是使用回火点,我从rexegg.com借用了它的名称约定:(?!(?:(?!{%).)*?%})

(?:(?!{%).)*?是对[^{%]的替换,并且在内部进行否定的前瞻,该前瞻断言当前位置之后的不是字符串{%

4-我不喜欢(\|.|*|/|-|)|+|$|||[|]|(|^|?|!|~),必须将其替换为可读性更强、更简单的内容:{0

5-它不能保证嵌套或不平衡分隔符的正确匹配。

最终解决方案(现场演示):

([/.*)($.+|^?!`[]-])(?!(?:(?!{%).)*?%})

最新更新