【发布时间】:2016-02-19 08:59:04
【问题描述】:
我对为什么会发生这种情况感到非常困惑,并希望有人能解释正则表达式引擎中发生的事情的机制。
在进行代码战练习时,“您的意思是……?”在 Javascript 中,我试图计算 word1 中有多少字符出现在 word2 中。我正在尝试将每个字符作为其自己的匹配组进行匹配,以便稍后我可以计算数组中成功匹配的数量,并使用它来找出这两个单词的相似程度。
请不要给我如何解决代码战挑战的提示,只是帮助我了解这里发生了什么。
我试过了:
'berry'.match(/(c?)(h?)(e?)(r?)(r?)(y?)/)
没有找到匹配项
> ["", "", "", "", "", "", ""]
这对我来说是个谜。搜索了 Regular-expressions.info 后,?(使前面的字符可选)是贪婪的,所以虽然没有匹配对正则表达式有效,但不应该首先被贪婪的版本打败吗?我期待这个:
> ["", "", "", "e", "r", "r", "y"]
我尝试过的其他事情: - 樱桃匹配樱桃按我的预期工作
'cherry'.match(/(c?)(h?)(e?)(r?)(r?)(y?)/)
> ["cherry", "c", "h", "e", "r", "r", "y"]
cherl match cherry 也符合我的预期
'cherl'.match(/(c?)(h?)(e?)(r?)(r?)(y?)/)
> ["cher", "c", "h", "e", "r", "", ""]
如果我从最终的y 中删除?,它也会按预期工作:
'berry'.match(/(c?)(h?)(e?)(r?)(r?)(y)/)
> ["erry", "", "", "e", "r", "r", "y"]
那么为什么在最后的y 上添加? 意味着我不再看到任何匹配的字符?
虽然我在 JS 中尝试过,但我在 PY 和 PCRE 中得到了相同的结果
【问题讨论】:
-
?表示一个或无,并且总是为真 - 找不到任何内容被视为匹配项。它是贪婪的,因为它试图首先找到一些东西(而不是相反的惰性量词:尝试满足于nothing)。 -
您没有在 JS 中使用
/g,因此您得到了一个匹配项:字符串开头的空位置。看看this demo -
感谢 Jan,Wiktor - 特别是 Wiktor - 这很有意义。因此,正则表达式引擎在尝试匹配的字符串上从左到右工作,如果没有
g标志,它会在字符串的开头找到零字符的匹配。
标签: javascript regex regex-greedy