一、问题描述
当使用带有捕获分组的正则表达式进行字符串分割时,分隔符会被保留在结果数组中,并作为数组的一部分返回。
s = `abc
def
ghi
`
比较两种正则表达式分割方式:
第一种:s.split(/(\n)+/)
第二种:s.split(/\n+/)
两种分割方式对应两种结果:
第一种: ['abc', '\n', 'def', '\n', 'ghi', '\n', '']
第二种:['abc', 'def', 'ghi', '']
二、解释:
当使用
/(\n)+/
作为分隔符时,括号(\n)
表示一个捕获分组,+
表示匹配前面的表达式一次或多次。因此,(\n)+
表示匹配一个或多个连续的换行符。在JavaScript中,当使用带有捕获分组的正则表达式进行字符串分割时,分隔符会被保留在结果数组中,并作为数组的一部分返回。这就是为什么在
s.split(/(\n)+/)
中,分隔符\n
会被保留在结果数组中的原因。如果不希望分隔符被保留在结果数组中,可以使用非捕获分组
(?: )
来定义正则表达式,例如/(?:\n)+/
。这样就可以实现分隔字符串并且不保留分隔符在结果数组中。
所以第一种方式如果想得到第二种方式同样的结果应该使用非捕获分组 (?: )
:s.split(/(?:\n)+/)