2014-04-25 128 views
0

我在javascript中使用正则表达式。为什么非贪婪的人物不会行事“不贪婪”?

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

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

我期待着得到/file结果,而是我得到整个字符串返回。我在这里不了解什么? ?应该使+非贪婪,这意味着它将匹配尽可能少的字符。

回答

2

正则表达式将始终尝试从左到右匹配。尽管.+?是非贪婪的,但是如果可能的话,正则表达式仍然会尝试从字符串的开始处进行匹配,并且只在匹配失败时才提前开始位置。

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

  • 包括在正则表达式的开始贪婪的比赛,这样你的对手永远远串入地开始,并使用捕获组抓住你想要的东西。这里的正则表达式可能看起来像/.*(\/.+?)$/,然后你会得到/file作为第一个捕获组的内容。
  • 更改正则表达式,使.+?不能匹配任何其他/,所以它会是/\/[^\/]+$/
+0

这是有道理的。感谢您的解释。我忘记了正则表达式匹配从左到右。 –

0

您可以使用否定您的需求:

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

你的正则表达式/\/.+?$/是匹配第一个斜杠,然后因为没有什么下面.+?匹配使用.+?输入的其余部分。

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

0

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

但是,你的正则表达式甚至有缺陷没有$/\/.+?/只匹配一个字符,其中整个字符串匹配/\/.+/。你根本没有指定任何约束。

抢只有第一部分,达 - 但不包括 - 下一个斜线,使用此:

/\/.[^\/]*/ 
+1

'/\/.+?/'不会匹配整个字符串,而只会匹配'/ p'。 –

+0

@MichaelMior:谢谢你的提醒;我只是自己意识到这一点。 – usr2564301