如果使用全局标志,我对JavaScript中.*
正则表达式的行为感到困惑:
var str = "Hello World!",
reg = new RegExp(".*","g");
var matched = str.match(reg);
// matched == ["Hello World!", ""]
我不明白为什么它会在matched
数组中添加一个空字符串。当正则表达式没有全局g
标志时,它不会发生。
它背后的逻辑是什么?
答案 0 :(得分:4)
每个字符串在每个字符之前和之后都有空字符串。
现在,你正在与.*
进行贪婪匹配,这实际上意味着“零个或多个字符并尽可能匹配”。在这里,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', '!' ]
它必须匹配一个或多个字符,但尽可能匹配。所以,它匹配一个字符,停止。全局修饰符再次匹配,匹配第二个字符,依此类推。
答案 1 :(得分:1)
点星贪婪地匹配任何字符(换行符除外)(零次或多次):
$("ul").find("li[data-slide='" + current + "']");
)也许图像更清楚点星实际上做了什么:
此外还有capture groups on regex101.com的链接。
答案 2 :(得分:0)
“*”表示零或更多,您应该使用“+”,试试这个:
var str = "Hello World!",
reg = new RegExp(".+","g");
var matched = str.match(reg);