我在javascript中使用正则表达式。为什么非贪婪的人物不会行事“不贪婪”?
我有这样的正则表达式:/\/.+?$/
与此字符串:/path/to/file
我期待着得到/file
结果,而是我得到整个字符串返回。我在这里不了解什么? ?
应该使+
非贪婪,这意味着它将匹配尽可能少的字符。
我在javascript中使用正则表达式。为什么非贪婪的人物不会行事“不贪婪”?
我有这样的正则表达式:/\/.+?$/
与此字符串:/path/to/file
我期待着得到/file
结果,而是我得到整个字符串返回。我在这里不了解什么? ?
应该使+
非贪婪,这意味着它将匹配尽可能少的字符。
正则表达式将始终尝试从左到右匹配。尽管.+?
是非贪婪的,但是如果可能的话,正则表达式仍然会尝试从字符串的开始处进行匹配,并且只在匹配失败时才提前开始位置。
你有几个选项来解决这个问题:
/.*(\/.+?)$/
,然后你会得到/file
作为第一个捕获组的内容。.+?
不能匹配任何其他/
,所以它会是/\/[^\/]+$/
。您可以使用否定您的需求:
'/path/to/file'.match(/\/[^/]+$/);
//=> ["/file"]
你的正则表达式/\/.+?$/
是匹配第一个斜杠,然后因为没有什么下面.+?
匹配使用.+?
输入的其余部分。
如果您使用:/\/.+?\/$/
,您会看到不同的行为,这将表现出不情愿并且匹配/path/
。
表达式末尾的$
强制强制结束字符串匹配。唯一的方法就是抓住整个字符串,贪婪与否。
但是,你的正则表达式甚至有缺陷没有$
。 /\/.+?/
只匹配一个字符,其中整个字符串匹配/\/.+/
。你根本没有指定任何约束。
抢只有第一部分,达 - 但不包括 - 下一个斜线,使用此:
/\/.[^\/]*/
'/\/.+?/'不会匹配整个字符串,而只会匹配'/ p'。 –
@MichaelMior:谢谢你的提醒;我只是自己意识到这一点。 – usr2564301
这是有道理的。感谢您的解释。我忘记了正则表达式匹配从左到右。 –