现在我使用下面的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-它不能保证嵌套或不平衡分隔符的正确匹配。
最终解决方案(现场演示):
([/.*)($.+|^?!`[]-])(?!(?:(?!{%).)*?%})