我有一个长Regex (JavaScript),它包含以下构造:
((\\\\)|(\\[abc])|([^abc]))*regex说:
匹配任何不包含字母a、b和c的字符串。
除非他们是被反斜杠逃脱的。
如果反斜杠是逃跑的(如。( \\a),也不匹配这些字母。
这里有一个简单的匹配示例:
eeeaeaee\aee\\\\ae\\\\\aee
我想知道是否有可能优化这个正则表达式。这只是一个小例子,我使用的实际正则表达式更大,而且我有很多代码两次。
发布于 2014-05-10 18:43:20
我认为更符合逻辑(而且可能更快)的regexp应该是这样的:
(?:[^abc\\]|\\.)*换句话说,反斜杠将逃避任何东西,包括另一个反斜杠。
注意以下几点:首先,如果不需要捕获匹配的部分,请使用非捕获组。给你买了点表演。第二,当有多种选择时,把最常见的选择放在第一位。
这样您可能会获得更好的性能(尝试一下):
[^abc\\]*(?:\\.[^abc\\]*)*而不是对每个字符进行交替,这将“吃掉”的非特殊字符运行的一个步骤。嵌套*可能是坏消息,在正则表达式不匹配的情况下,会导致二次(或更糟)运行时,但在这种情况下不会发生这种情况。
在写这个答案时,我发现JS的regex引擎没有占有匹配器。太糟糕了--如果你有机会的话,你可能会有更好的表现。(实现regex掌握的一个重要提示:当性能测试正则表达式时,始终测试它匹配和不匹配的地方。最坏的表现通常发生在没有的时候。)
发布于 2014-05-10 18:37:37
可以在反斜杠后匹配任何字符,也可以匹配[abc]中没有的任何字符。
(\\.|[^abc])*这将符合完全相同的语言。
我认为更清楚的是,如果你把它翻转成这样,你的意图是:
([^abc]|\\.)*https://stackoverflow.com/questions/23584768
复制相似问题