javascript - 为什么使用包含捕获组的正则表达式的 string.split 返回以空字符串结尾的数组?

标签 javascript regex string split

我想在第一个冒号上分割输入字符串,该冒号后面仍然有字符在同一行。

为此,我使用正则表达式 /:(.+)/

给定字符串

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/

相关文章:

javascript - S3 从浏览器上传带有预签名 url 的图像

ruby-on-rails - 如何在 ruby​​-on-rails 中为 3 位数字编写验证?

ios - 为什么此 Regex 代码不适用于 P.O.箱子串?

android - 在android中将对象转换为字符串时丢失了一些数据

string - 在 Fortran 中按名称获取文件单元,反之亦然

javascript - SetRequiredLevel 它是如何工作的?

javascript - 使用聚合查找数组中对象的索引

javascript - 如何调用json API特定键

regex - 是否有可能找到具有反向引用的独占匹配项(在或组语句中)?

c - 从文件中读取,但不是每一行