我想在第一个冒号上分割输入字符串,该冒号后面仍然有字符在同一行。
为此,我使用正则表达式 /:(.+)/
给定字符串
aaa:
bbb:ccc
我期望的输出
["aaa:\nbbb", "ccc"]
并给出字符串
aaa:bbb:ccc
我期望的输出
["aaa", "bbb:ccc"]
然而,当我实际运行这些命令时,我得到了
["aaa:\nbbb", "ccc", ""]
["aaa", "bbb:ccc", ""]
作为输出。
不知何故,javascript 在数组末尾添加了一个空字符串。
我已经检查了documentation for String.split
虽然它确实提到,如果您对具有指定分隔符的空字符串执行 string.split
,您将获得一个包含 1 个空字符串的数组(而不是空数组)。它没有提到输出中始终存在空字符串,也没有提到如果犯了常见错误或其他错误,可能会得到此结果的警告。
我会理解我的输入字符串末尾是否有冒号或类似的东西;然后它在冒号处分开,匹配的其余部分是空字符串。这就是 Splitting string with regular expression to make it array without empty element 中提到的问题- 但我没有这个问题,因为我的输入字符串不以分隔符结尾。
我知道在我的情况下,一个快速解决方案是通过 "aaa:bbb:ccc".split(/:(.+)/, 2) 简单地限制匹配数量
,但我仍然很好奇:
为什么此 string.split
调用返回一个以空字符串结尾的数组?
最佳答案
如果我们将正则表达式更改为 /:.+/
并对其执行拆分,您将得到:
["aaa", ""]
这是有道理的,因为正则表达式与 :bbb:ccc
匹配。
如果您要手动拆分该字符串,则会给出相同的输出。
>>> 'aaa:bbb:ccc'.split(':bbb:ccc')
['aaa', '']
添加捕获组只会保存 bbb:ccc
,但不应更改原始拆分行为。
关于javascript - 为什么使用包含捕获组的正则表达式的 string.split 返回以空字符串结尾的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38261359/