首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化:(\\[abc]区[^abc])*

优化:(\\[abc]区[^abc])*
EN

Stack Overflow用户
提问于 2014-05-10 18:25:29
回答 2查看 54关注 0票数 0

我有一个长Regex (JavaScript),它包含以下构造:

代码语言:javascript
复制
((\\\\)|(\\[abc])|([^abc]))*

regex说:

匹配任何不包含字母a、b和c的字符串。

除非他们是被反斜杠逃脱的。

如果反斜杠是逃跑的(如。( \\a),也不匹配这些字母。

这里有一个简单的匹配示例:

eeeaeaee\aee\\\\ae\\\\\aee

我想知道是否有可能优化这个正则表达式。这只是一个小例子,我使用的实际正则表达式更大,而且我有很多代码两次。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-10 18:43:20

我认为更符合逻辑(而且可能更快)的regexp应该是这样的:

代码语言:javascript
复制
(?:[^abc\\]|\\.)*

换句话说,反斜杠将逃避任何东西,包括另一个反斜杠。

注意以下几点:首先,如果不需要捕获匹配的部分,请使用非捕获组。给你买了点表演。第二,当有多种选择时,把最常见的选择放在第一位。

这样您可能会获得更好的性能(尝试一下):

代码语言:javascript
复制
[^abc\\]*(?:\\.[^abc\\]*)*

而不是对每个字符进行交替,这将“吃掉”的非特殊字符运行的一个步骤。嵌套*可能是坏消息,在正则表达式不匹配的情况下,会导致二次(或更糟)运行时,但在这种情况下不会发生这种情况。

在写这个答案时,我发现JS的regex引擎没有占有匹配器。太糟糕了--如果你有机会的话,你可能会有更好的表现。(实现regex掌握的一个重要提示:当性能测试正则表达式时,始终测试它匹配和不匹配的地方。最坏的表现通常发生在没有的时候。)

票数 2
EN

Stack Overflow用户

发布于 2014-05-10 18:37:37

可以在反斜杠后匹配任何字符,也可以匹配[abc]中没有的任何字符。

代码语言:javascript
复制
(\\.|[^abc])*

这将符合完全相同的语言。

我认为更清楚的是,如果你把它翻转成这样,你的意图是:

代码语言:javascript
复制
([^abc]|\\.)*
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23584768

复制
相关文章

相似问题

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