'any string'正则表达式的JS匹配返回整个空字符串

时间:2016-07-12 06:17:40

标签: javascript regex string

如果使用全局标志,我对JavaScript中.*正则表达式的行为感到困惑:

var str = "Hello World!",
    reg = new RegExp(".*","g");
var matched = str.match(reg); 
// matched == ["Hello World!", ""]

我不明白为什么它会在matched数组中添加一个空字符串。当正则表达式没有全局g标志时,它不会发生。

它背后的逻辑是什么?

3 个答案:

答案 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)

点星贪婪地匹配任何字符(换行符除外)(零次或多次):

  1. 第一步匹配整个字符串($("ul").find("li[data-slide='" + current + "']");
  2. 第二次尝试查看最后一场比赛的结束并尝试再次匹配相同的模式。点匹配任何字符,明星表示零次或多次,因此匹配
  3. 也许图像更清楚点星实际上做了什么:

    regex101.com

    此外还有capture groups on regex101.com的链接。

答案 2 :(得分:0)

“*”表示零或更多,您应该使用“+”,试试这个:

var str = "Hello World!",
reg = new RegExp(".+","g");
var matched = str.match(reg);