为什么这个正则表达式如此之慢?

时间:2013-07-31 19:05:12

标签: javascript regex performance

我正在尝试修剪字符串中的前导和尾随空格和换行符。换行符写为\n(两个单独的字符,斜杠和n)。换句话说,它是一个字符串文字,而不是CR LF特殊字符。

例如,这个:

\n \nRight after this is a perfectly valid newline:\nAnd here is the second line. \n

应该成为这个:

Right after this is a perfectly valid newline:\nAnd here is the second line.

我提出了这个解决方案:

text = text
        .replace(/^(\s*(\\n)*)*/, '') // Beginning
        .replace(/(\s*(\\n)*)*$/, '') // End

根据RegexPal,这些模式匹配得很好。

但是,第二个模式(匹配字符串的结尾)需要很长时间 - Chrome中的字符串只有32秒,只有几个段落和一些尾随空格。第一个模式在同一个字符串上非常快(毫秒)。

Here is a CodePen to demonstrate it

为什么这么慢?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:7)

需要这么长时间的原因是因为您有*量化另外两个*

可以在PHP manual中找到一个很好的解释,但我认为JavaScript不支持只使用一次的子模式。

我会建议这个正则表达式:

text = text.replace(/^(?:\s|\\n)+|(?:\s|\\n)+$/g,"");

答案 1 :(得分:-3)

不是一个好的答案,但一个解决方法是反转字符串,并在正则表达式中反转\ n到n \(开头),应用它,然后反转字符串。