我对 .*
的行为感到困惑如果使用全局标志,JavaScript 中的正则表达式:
var str = "Hello World!",
reg = new RegExp(".*","g");
var matched = str.match(reg);
// matched == ["Hello World!", ""]
我不明白为什么它要向 matched
添加一个空字符串大批。当正则表达式没有全局 g
时,不会发生这种情况。标志。
其背后的逻辑是什么?
最佳答案
每个字符串的每个字符之前和之后都有空字符串。
现在,您正在与 .*
进行贪婪匹配,这实际上意味着“零个或多个字符并尽可能匹配”。这里,Hello World!
与 .*
匹配,然后是全局修饰符。因此,它尝试再次匹配并匹配末尾的空字符串(之所以匹配,是因为 .*
表示零个或多个字符)。这就是您在结果中得到它的原因。
您可以使用+
确认相同的内容,如下所示
var str = "Hello World!";
var reg = new RegExp(".+", "g");
console.log(str.match(reg));
// [ 'Hello World!' ]
这里,+
表示一次或多次。由于 .+
与 Hello World!
匹配,因此全局修饰符再次搜索,但找不到更多可匹配的字符。
想看一些有趣的东西吗?试试这个
var str = "Hello World!";
var reg = new RegExp(".*?", "g");
console.log(str.match(reg));
// [ '', '', '', '', '', '', '', '', '', '', '', '', '' ]
这是为什么呢? .*?
表示匹配零个或多个字符,但仅匹配尽可能少的字符(非贪婪)。因此,它从第一个字符开始,找到空字符串就关闭搜索。全局修饰符再次进行匹配,在H
之后找到另一个空字符串,依此类推,直到到达字符串末尾。
但是如果你使用+
,就像这样
var str = "Hello World!";
var reg = new RegExp(".+?", "g");
console.log(str.match(reg));
// [ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' ]
它必须匹配一个或多个字符,但匹配次数尽可能少。所以,它匹配一个字符,停止。全局修饰符再次匹配,匹配第二个字符,依此类推。
关于javascript - JS匹配 'any string'正则表达式返回整个空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38321288/