优化:(\\ [abc] | [^ abc])*

时间:2014-05-10 18:25:30

标签: javascript regex

我有一个很长的正则表达式(JavaScript),它包含以下结构:

((\\\\)|(\\[abc])|([^abc]))*

正则表达式说:

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

除非他们被反斜杠逃脱。

如果反斜杠被转义(例如\\a),也不匹配这些字母。

以下是一个简单的匹配示例:

eeeeee\aee\\\\e\\\\\aee

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

2 个答案:

答案 0 :(得分:2)

您可以匹配反斜杠后的任何字符或[abc]以外的任何字符:

(\\.|[^abc])*

这将与完全相同的语言相匹配。

我认为,如果你翻转一下,你的意图实际上就更清楚了:

([^abc]|\\.)*

答案 1 :(得分:2)

我认为更合乎逻辑(也可能更快)的正则表达式将是:

(?:[^abc\\]|\\.)*

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

请注意以下几点:首先,如果您不需要捕获部分匹配项,请使用非捕获组。这会给你带来一点性能。第二,当有多种选择时,先把最常见的替代品放在首位。

你可能会以这种方式获得更好的表现(尝试一下):

[^abc\\]*(?:\\.[^abc\\]*)*

不是经历每个角色的交替,而是“吃掉”#34;只需一步即可运行非特殊字符。嵌套*可能是坏消息,在正则表达式不匹配的情况下导致二次(或更差)运行时,但在这种情况下不会发生。

在写这个答案时,我发现JS的正则表达式引擎没有占有性匹配器。这很糟糕 - 如果可用,你可以获得更好的最坏情况表现。 (正在进行正则表达式掌握的一个重要提示:当性能测试正则表达式时,总是测试它匹配的情况以及它不匹配的情况。最坏情况下的性能通常发生在它没有。)< / p>