我有一个很长的正则表达式(JavaScript),它包含以下结构:
((\\\\)|(\\[abc])|([^abc]))*
正则表达式说:
匹配任何不包含字母a,b和c的字符串。
除非他们被反斜杠逃脱。
如果反斜杠被转义(例如\\a
),也不匹配这些字母。
以下是一个简单的匹配示例:
eee
为e
为ee\aee\\\\
为e\\\\\aee
我想知道是否有可能优化这种调节表达式。这只是一个小例子,我使用的实际正则表达式更大,而且我有两次代码。
答案 0 :(得分:2)
您可以匹配反斜杠后的任何字符或[abc]
以外的任何字符:
(\\.|[^abc])*
这将与完全相同的语言相匹配。
我认为,如果你翻转一下,你的意图实际上就更清楚了:
([^abc]|\\.)*
答案 1 :(得分:2)
我认为更合乎逻辑(也可能更快)的正则表达式将是:
(?:[^abc\\]|\\.)*
换句话说,反斜杠会逃避任何,包括另一个反斜杠。
请注意以下几点:首先,如果您不需要捕获部分匹配项,请使用非捕获组。这会给你带来一点性能。第二,当有多种选择时,先把最常见的替代品放在首位。
你可能会以这种方式获得更好的表现(尝试一下):
[^abc\\]*(?:\\.[^abc\\]*)*
不是经历每个角色的交替,而是“吃掉”#34;只需一步即可运行非特殊字符。嵌套*
可能是坏消息,在正则表达式不匹配的情况下导致二次(或更差)运行时,但在这种情况下不会发生。
在写这个答案时,我发现JS的正则表达式引擎没有占有性匹配器。这很糟糕 - 如果可用,你可以获得更好的最坏情况表现。 (正在进行正则表达式掌握的一个重要提示:当性能测试正则表达式时,总是测试它匹配的情况以及它不匹配的情况。最坏情况下的性能通常发生在它没有。)< / p>