为什么 javascript 替换字符串函数会这样做?
"aaa\nbbb\nccc".replace(/.*/gm, ".")
// result = "..\n..\n.." but expected was: ".\n.\n."
"aaa\nbbb\nccc".replace(/^.*/gm, ".")
// result = ".\n.\n." -> OK!!!
"aaa\nbbb\nccc".replace(/.*$/gm, ".")
// result = "..\n..\n.." but expected was: ".\n.\n."
我做错了什么?
最佳答案
让我以相反的顺序解决这些问题:
What I am doing wrong?
您想使用+
,而不是*
。 *
表示零个或多个 匹配项,这在这里没有意义。 +
表示一个或多个 匹配项。所以:
"aaa\nbbb\nccc".replace(/.+/g, ".")
// ".\n.\n."
另请注意,如果您不使用 ^
或 $
(您的第一个示例),则不需要 m
修饰符(但这不是你在做什么的问题)。而且您不需要 ^
或 $
因为 .
doesn't match newlines (在回答这个问题之前我不知道的事情)。
Why does javascript replace string function do this?
我没有世俗的想法,希望有人知道。
同样,通过使用 *
,您说的是零个或多个 匹配项。所以它匹配所有相关字符,用第一个点替换它们;然后它匹配 0 个字符,用一个点替换它们。结果:两个点。
证明:
"aaa\nbbb\nccc".replace(/.*/g, function(m) {
console.log("m = '" + m + "'");
});
输出:
m = 'aaa' m = '' m = 'bbb' m = '' m = 'ccc' m = ''
关于Javascript 字符串 regex/.*/gm 不会一次捕获所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518229/