我正在使用javascript中的正则表达式。
我有这个正则表达式:/\/.+?$/
和此字符串:/path/to/file
我希望得到/file
,但我得回来了整个字符串。我在这里不理解什么? ?
应该使+
非贪婪,这意味着它将匹配尽可能少的字符。
答案 0 :(得分:2)
正则表达式总是尝试从左到右匹配。即使.+?
非贪婪,如果可能,正则表达式仍然会尝试从字符串的开头匹配,并且只有在匹配失败时才提前起始位置。
您有几种方法可以解决此问题:
/.*(\/.+?)$/
,然后你会得到/file
作为第一个捕获组中的内容。.+?
无法与任何其他/
匹配,因此它将是/\/[^\/]+$/
。答案 1 :(得分:0)
您可以根据需要使用否定:
'/path/to/file'.match(/\/[^/]+$/);
//=> ["/file"]
您的正则表达式/\/.+?$/
匹配第一个斜杠,然后使用.+?
匹配其余输入,因为.+?
后面没有任何内容。
如果您使用/\/.+?\/$/
,您可以看到不同的行为,这种行为会不情愿并与/path/
匹配。
答案 2 :(得分:0)
表达式末尾的$
强制强制结束字符串匹配。唯一的方法是抓住整个字符串,贪婪或不贪。
但是,即使没有 $
,你的正则表达式也存在缺陷。 /\/.+?/
只匹配一个字符,整个字符串由/\/.+/
匹配。您根本不指定任何约束。
要仅获取第一部分,最多 - 但不包括 - 下一个斜杠,请使用:
/\/.[^\/]*/