Javascript字符串regex /.*/gm不会立即捕获所有行

Jul*_*ito 5 javascript regex replace

为什么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."
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

T.J*_*der 6

让我以相反的顺序解决这些问题:

我做错了什么?

你想要使用+,而不是*.*意味着零或多个匹配,这在这里没有意义.+表示一个或多个匹配.所以:

"aaa\nbbb\nccc".replace(/.+/g, ".")
// ".\n.\n."
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您不使用^$(您的第一个示例),则不需要m修饰符(但这不是您正在做的事情的问题).并且您不需要^$因为. 不符合换行符(在回答此问题之前我不知道的事情).

为什么javascript替换字符串函数这样做?

我没有地球上的想法,希望别人能做到.

再次,通过使用*你说零或更多匹配.所以它匹配所有相关的字符,用第一个点替换它们; 然后它匹配零个字符,用一个点替换它们.结果:两个点.

证明:

实时复制 | 直播源

"aaa\nbbb\nccc".replace(/.*/g, function(m) {
    console.log("m = '" + m + "'");
});
Run Code Online (Sandbox Code Playgroud)

输出:

m = 'aaa'
m = ''
m = 'bbb'
m = ''
m = 'ccc'
m = ''