我有一个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"]
有人可以解释为什么这三个正则表达式在这一点上表现不同吗?
答案 0 :(得分:1)
由于第二和第三个捕获组。来自the specification:
如果分隔符是包含捕获括号的正则表达式,则每次分隔符与结果(包括任何未定义的结果)匹配时捕获括号被拼接到输出数组中。
您可以将捕获组非捕获组更改为(?:\n)
和(?:\n\n)
。但请注意,在您的第二个示例中,根本不需要任何组,只需\n{2}
即可。 (谈到这一点,在第三个例子中也没有必要。)
您不需要使用字符串,RegExp
构造函数,\n
也表示正则表达式文字中的“换行符”:/\n{2}/
。