为什么这三个正则表达式将字符串分开,尽管它们看起来是等价的?

时间:2015-08-17 08:18:55

标签: javascript regex split

我有一个textarea,人们可以粘贴文本。我需要一个正则表达式来分隔空行上的文本。我写了'a\n\nb'.split('(\r?\n){2}'并且没有给出预期的结果(['a', '\n', 'b']而不是['a', 'b'])。

我进一步发现这三行都给出了不同的结果,因为树正则表达式看起来与我相当,即我希望所有三行都匹配两个连续的换行符。

> 'a\n\nb'.split(new RegExp('\n\n'))
< ["a", "b"]
> 'a\n\nb'.split(new RegExp('(\n){2}'))
< ["a", "
  ", "b"]
> 'a\n\nb'.split(new RegExp('(\n\n)'))
< ["a", "

  ", "b"]

有人可以解释为什么这三个正则表达式在这一点上表现不同吗?

1 个答案:

答案 0 :(得分:1)

由于第二和第三个捕获组。来自the specification

  

如果分隔符是包含捕获括号的正则表达式,则每次分隔符与结果(包括任何未定义的结果)匹配时捕获括号被拼接到输出数组中。

您可以将捕获组非捕获组更改为(?:\n)(?:\n\n)。但请注意,在您的第二个示例中,根本不需要任何组,只需\n{2}即可。 (谈到这一点,在第三个例子中也没有必要。)

您不需要使用字符串,RegExp构造函数,\n也表示正则表达式文字中的“换行符”:/\n{2}/