代码之家  ›  专栏  ›  技术社区  ›  markasoftware

C regexec找不到与简单贪心regex[重复]匹配的最长匹配项

  •  0
  • markasoftware  · 技术社区  · 6 年前

    有人能帮助我理解为什么使用\d*返回一个包含空字符串的数组,而使用\d+返回[“100”](如预期)。我知道为什么d+有效,但不明白为什么d*不起作用。使用*是否会导致返回零长度匹配,这究竟是如何工作的?

    var str = 'one to 100';
    var regex = /\d*/;
    console.log(str.match(regex));
    // [""]
    
    0 回复  |  直到 9 年前
        1
  •  8
  •   StriplingWarrior    9 年前

    记住这一点 match 正在查找它可以找到的与给定正则表达式匹配的第一个子字符串。

    * 意味着可能没有或更多的东西,所以 \d* 意味着您正在查找包含零个或多个数字的字符串。

    如果输入字符串以数字开头,则整个数字将匹配。

    "5 to 100".match(/\d*/); // "5"
    "5 to 100".match(/\d+/); // "5"
    

    但由于第一个字符不是数字, match() 图中字符串的开头(不带字符)与正则表达式匹配。

    由于字符串不以任何数字开头,因此空字符串是与该正则表达式匹配的输入的第一个子字符串。

        2
  •  3
  •   Martin Konecny    9 年前

    /\d*/

    意思是“ 与从字符串开头开始的0个或多个数字匹配 “。

    当你开始你的字符串,它立即击中一个非数字,不能再进一步。但这是 被认为是一场成功的比赛 因为“0或更多”。

    您可以通过

    /\d+/
    

    或者您可以告诉它从字符串末尾匹配“0或更多”:

    /\d*$/
    

    在python中查找全部

    在python中,有 findall() 方法,该方法返回与正则表达式匹配的字符串的所有部分。

    re.findall(r'\d*', 'one to 100')
    # => ['', '', '', '', '', '', '', '100', '']
    

    .match() 在javascript中,只返回第一个匹配项,这将是上面数组中的第一个元素。

        3
  •  2
  •   James Thorpe    9 年前

    * 表示0或更多,因此匹配0次。你需要使用 + 一个或多个。默认情况下它是贪婪的,所以会匹配 100 以下内容:

    var str = 'one to 100';
    var regex = /\d+/;
    console.log(str.match(regex));
    // ["100"]
    
        4
  •  1
  •   Rafid    9 年前

    正如@stripplingwarrior在下面所说,空字符串是第一个匹配项,因此它将被返回。我想补充一点,您可以通过注意'index'字段来判断正则表达式匹配的是什么 match 返回。例如,这就是我在chrome中运行代码时得到的结果:

    ["", index: 0, input: "one to 100"]