为什么非贪婪的角色没有表现得非贪婪?

时间:2014-04-25 22:36:21

标签: javascript regex regex-greedy

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

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

和此字符串:/path/to/file

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

3 个答案:

答案 0 :(得分:2)

正则表达式总是尝试从左到右匹配。即使.+?非贪婪,如果可能,正则表达式仍然会尝试从字符串的开头匹配,并且只有在匹配失败时才提前起始位置。

您有几种方法可以解决此问题:

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

答案 1 :(得分:0)

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

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

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

如果您使用/\/.+?\/$/,您可以看到不同的行为,这种行为会不情愿并与/path/匹配。

答案 2 :(得分:0)

表达式末尾的$强制强制结束字符串匹配。唯一的方法是抓住整个字符串,贪婪或不贪。

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

要仅获取第一部分,最多 - 但不包括 - 下一个斜杠,请使用:

/\/.[^\/]*/