【发布时间】:2020-07-30 10:54:38
【问题描述】:
我偶然发现了一个(对我来说)令人惊讶的事实。
console.log("asdf".replace(/.*/g, "x"));
为什么要两个替换?似乎任何没有换行符的非空字符串都会为此模式产生两个替换。使用替换函数,我可以看到第一个替换是针对整个字符串,第二个是针对空字符串。
【问题讨论】:
-
更简单的例子:
"asdf".match(/.*/g)return [ "asdf", ""] -
因为全局 (g) 标志。全局标志允许在前一个匹配的末尾开始另一个搜索,从而找到一个空字符串。
-
说实话:可能没有人想要这种行为。这可能是希望
"aa".replace(/b*/, "b")产生babab的实现细节。在某些时候,我们标准化了网络浏览器的所有实现细节。 -
@Joshua 旧版本的 GNU sed(不是其他实现!)也出现此错误,该错误已在 2.05 和 3.01 版本之间(20 多年前)修复.我怀疑这种行为起源于那里,然后才进入 perl(它成为一个特性)并从那里进入 javascript。
-
@recursive - 够公平的。我发现他们都惊讶了一秒钟,然后意识到“零宽度匹配”并且不再感到惊讶。 :-)
标签: javascript regex