【问题标题】:Why is non-greedy character not acting 'non-greedy'?为什么不贪婪的角色不表现出“不贪婪”?
【发布时间】:2014-04-25 22:36:20
【问题描述】:

我正在使用 javascript 中的正则表达式。

我有这个正则表达式:/\/.+?$/

还有这个字符串:/path/to/file

我希望得到/file 的结果,但我却得到了整个字符串。我在这里不明白什么? ? 应该使 + 非贪婪,这意味着它将匹配尽可能少的字符。

【问题讨论】:

    标签: javascript regex regex-greedy


    【解决方案1】:

    正则表达式总是会尝试从左到右匹配。即使.+? 是非贪婪的,正则表达式仍会在可能的情况下尝试从字符串的开头进行匹配,并且仅在匹配失败时推进起始位置。

    你有几个选项来解决这个问题:

    • 在正则表达式的开头包含一个贪婪匹配,这样您的匹配将始终尽可能地从字符串开始,并使用捕获组来获取您想要的内容。此处的正则表达式可能类似于/.*(\/.+?)$/,然后您将获得/file 作为第一个捕获组中的内容。
    • 更改正则表达式,使.+? 无法匹配任何其他/,因此它将是/\/[^\/]+$/

    【讨论】:

    • 这是有道理的。感谢您的解释。我忘记了正则表达式从左到右匹配。
    【解决方案2】:

    您可以根据需要使用否定:

    '/path/to/file'.match(/\/[^/]+$/);
    //=> ["/file"]
    

    您的正则表达式/\/.+?$/ 匹配第一个斜杠,然后使用.+? 匹配输入的其余部分,因为.+? 后面没有任何内容。

    如果您使用:/\/.+?\/$/,您会看到不同的行为,它将不情愿地表现并匹配/path/

    【讨论】:

      【解决方案3】:

      表达式末尾的$ 强制进行字符串结尾匹配。这样做的唯一方法是抓取整个字符串,不管是否贪婪。

      但是,即使 没有 $,您的正则表达式也存在缺陷。 /\/.+?/ 将只匹配一个字符,其中整个字符串由/\/.+/ 匹配。您根本没有指定任何约束。

      要只抓取第一部分,直到 -- 但不包括 -- 下一个斜杠,请使用:

      /\/.[^\/]*/
      

      【讨论】:

      • /\/.+?/ 不会匹配整个字符串,而只会匹配/p
      • @MichaelMior:感谢您的提醒;我自己才意识到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      相关资源
      最近更新 更多