【发布时间】:2019-04-20 15:08:24
【问题描述】:
我正在用 javascript 试试这个
/\/.*?$/.exec('foo/bar/tar')[0]
我期待得到/tar,但得到/bar/tar。据我了解,非贪婪正则表达式将采用最小的匹配。
我用myvar.split('/').reverse()[0] 绕过了这个,但我不明白正则表达式出了什么问题。
【问题讨论】:
-
您的模式
\/.*?$匹配从第一个正斜杠到字符串末尾,即/bar/tar如果您想要匹配,您可以匹配正斜杠而不是斜杠\/[^\/]+$demo -
所以
\/.*?$等于\/.*$我知道非贪婪的正则表达式有效,但我只是错过了这个概念。我认为这是匹配较小的可能匹配,这将是/tar而不是/bar/tar那么非贪婪的正则表达式有什么意义?! -
您错过了正则表达式从左到右与输入字符串的每个位置匹配的点。
/.*?$和/.*$之间的区别在于惰性版本一次匹配一个字节,然后检查下一个位置是否是输入字符串的结尾,如果不是,则按字节扩展匹配,然后再次检查输入字符串的结尾。 . 但是对于贪心版本,.匹配的所有内容都会立即从第一个/开始消耗,然后检查下一个直接位置是否是输入字符串的结尾。所以他们并不完全平等。从两个 RE 中删除$以查看它们的行为。 -
revo 您可以发布答案吗?我刚收到
-
.*?不匹配最短但匹配第一个可能出现的位置。这是更好的定义。
标签: javascript regex regex-greedy