现在,我使用下面的正则表达式跳过{% ... %}之间的所有内容
(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~|\`)(?![^{%]*?%})然而,这有时不能正常工作,因为当我有文本时:
"This is test. ! {%.?{1}.%} . and it doesn't work"它坏了,它还匹配{% %}区域中的点,这是我不想要的。{和}打破了它。负向前视应该查找{%字符串,而不是单字符{或}。
应该跳过{% ... %}之间的所有内容。
有什么想法吗?
发布于 2016-06-26 08:40:39
通过查看您的正则表达式,我发现您犯了一些错误,我将指出这些错误。
简单地说,1- (?![^{%]*?%})并不意味着所有的东西,而是在{%..%}之间。您使用了字符集[^{%],这意味着{ 或 %和not {%一起使用。它的意思是:前面的字符之一不是(后跟除{或%之外的零个或多个字符,并以%} 结尾)
换句话说,你可以像(?!%})一样写它,这就是为什么除了%}之前的.之外的那些特殊字符是匹配的
"This is test. ! {%.?{1}.%} . and it doesn't work"
^2-,因此您不应该只检查{或%,而应该同时检查两者。但是,在我看到您的正则表达式时,您只能检查%:(?![^%]*?%})。但是,如果您的输入字符串中包含如下内容,则此操作将失败:
"This is test.%} ! {%.%?{1}.%} . and it doesn't work"
^指向的dot也会被捕获。
3-一个好的解决方案是使用一个我借用自rexegg.com的命名约定:(?!(?:(?!{%).)*?%})
这个(?:(?!{%).)*?是对[^{%]的替换,在里面做了一个否定的先行检查,断言当前位置后面的不是字符串{%。
4-我不喜欢(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~),我不得不用更易读、更简单的东西来代替它:([\/.*)($.+|^?!\[\]-])
5-它不保证嵌套或不平衡分隔符的正确匹配。
最终解决方案(Live demo):
([\/.*)($.+|^?!`\[\]-])(?!(?:(?!{%).)*?%})https://stackoverflow.com/questions/26787110
复制相似问题