首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex Lookahead问题和改进

Regex Lookahead问题和改进
EN

Stack Overflow用户
提问于 2014-11-07 02:46:51
回答 1查看 43关注 0票数 0

现在,我使用下面的正则表达式跳过{% ... %}之间的所有内容

代码语言:javascript
复制
(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~|\`)(?![^{%]*?%})

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

代码语言:javascript
复制
"This is test. ! {%.?{1}.%} .  and it doesn't work"

它坏了,它还匹配{% %}区域中的点,这是我不想要的。{}打破了它。负向前视应该查找{%字符串,而不是单字符{}

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

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-26 08:40:39

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

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

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

代码语言:javascript
复制
"This is test. ! {%.?{1}.%} .  and it doesn't work"
                        ^

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

代码语言:javascript
复制
"This is test.%} ! {%.%?{1}.%} .  and it doesn't work"
                     ^

指向的dot也会被捕获。

3-一个好的解决方案是使用一个我借用自rexegg.com的命名约定:(?!(?:(?!{%).)*?%})

这个(?:(?!{%).)*?是对[^{%]的替换,在里面做了一个否定的先行检查,断言当前位置后面的不是字符串{%

4-我不喜欢(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~),我不得不用更易读、更简单的东西来代替它:([\/.*)($.+|^?!\[\]-])

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

最终解决方案(Live demo):

代码语言:javascript
复制
([\/.*)($.+|^?!`\[\]-])(?!(?:(?!{%).)*?%})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26787110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档