gpt4 book ai didi

javascript - .split().join() 返回比原来更多的字符

转载 作者:行者123 更新时间:2023-11-29 10:15:30 24 4
gpt4 key购买 nike

在使用捕获组进行前瞻拆分字符串时,我看到了奇怪的行为。

我有时会得到比原始字符串更多的字符。我认为这不可能。

Javascript JsFiddle

'ab'.split(/(?=b)/).join('');
'ab'.split(/(?=(?:b))/).join('');
'ab'.split(/(?=(b))/).join('');

'ab'
'ab'
'abb'

其他语言:

Java/Scala

"ab".split("(?=b)").mkString
"ab".split("(?=(?:b))").mkString
"ab".split("(?=(b))").mkString

"ab"
"ab"
"ab"

PHP

implode(preg_split('/(?=b)/', 'ab'));
implode(preg_split('/(?=(?:b))/', 'ab'));
implode(preg_split('/(?=(b))/', 'ab'));

'ab'
'ab'
'ab'

为什么 Javascript 最终会比第三个正则表达式的原始字符串更多的字符?我已经用 Chrome、Firefox、Opera 和 IE 11 重现了这个。


编辑:

看起来 Ruby 做同样的事情:

'ab'.split(%r{(?=b)}).join
'ab'.split(%r{(?=(?:b))}).join
'ab'.split(%r{(?=(b))}).join

'ab'
'ab'
'abb'

最佳答案

来自 MDN :

If separator is a regular expression that contains capturing parentheses, then each time separator is matched, the results (including any undefined results) of the capturing parentheses are spliced into the output array.

所以当你有一个捕获组时,即使是在前瞻中,像这样:

'ab'.split(/(?=(b))/)

结果将包括 ab,即与前瞻匹配的位置前后的字符串的两个部分,但它也将包括与前瞻中的组匹配的字符串,b

然而,MDN 文章继续指出:

However, not all browsers support this capability.

所以我不一定期望这种行为在所有浏览器中都是一致的。

关于javascript - .split().join() 返回比原来更多的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22852582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com