【发布时间】:2021-02-09 11:00:34
【问题描述】:
我注意到量词有 3 种不同类别:贪婪、懒惰(即非贪婪)和所有格。
我知道,粗略地说,greedy 量词试图通过首先读取整个输入字符串来获得最长的匹配,然后如果尝试继续失败,则一个一个地截断字符; lazy 量词尝试通过首先读取空字符串来获得最短匹配,然后如果尝试继续失败,则一个一个地添加字符; 占有量词尝试与贪婪量词相同的方式,但如果第一次尝试失败,它们将停止匹配。
但是,我不确定上述内容是如何在“内部”实施的,并希望得到澄清(希望有示例)。
例如,假设我们的输入字符串为"fooaaafoooobbbfoo"。
如果正则表达式是"foo.*"(贪婪),那么正则表达式中的foo 是否会首先匹配输入字符串中的foo,然后.* 会读入aaafoooobbbfoo 作为“整个字符串”?或者.* 会首先将fooaaafoooobbbfoo 读入“整个字符串”,然后截断fooaaafoooobbbfoo 以尝试匹配正则表达式中的foo?如果是后者,fooaaafoooobbbfoo 会在每次尝试中从左侧截断还是从右侧截断?
如果我将"foo.*" 替换为".*foo" 或"foo.*foo" 作为我的正则表达式,上述问题的答案会改变吗?如果我把那些贪婪的量词改成懒惰的和所有格的呢?
如果一个正则表达式中有多个量词,引擎将如何处理优先级(如果重要的话)?
提前致谢!
【问题讨论】:
-
提示:使用Regex Debugger实时查看步骤。
标签: regex regex-greedy non-greedy