懒惰量词 {n,m} 中的 max m 有什么作用?

3
在正则表达式中,我们有贪婪和懒惰量词。贪婪量词{n,m}匹配前面的原子/字符/组,最少n次,最多m次,包括n和m。
如果我有一组字符串:
a
aa
aaa
aaaa
aaaaaaaaaa

使用a{2,4},它会匹配:

  • 第一行没有
  • 第二行是aa
  • 第三行是aaa
  • 第四行是aaaa
  • 第五行是(aaaa), (aaaa)和(aa)

这很有意义。

然而,如果我使用惰性量词a{2,4}?,我得到:

  • 第一行没有
  • 第二行是aa
  • 第三行是aa
  • 第四行是(aa)和(aa)
  • 第五行是(aa), (aa), (aa), (aa)和(aa)

这实际上是有意义的。它找到可能匹配最少的数量。

我想澄清的部分 - 是否有任何用处以 {n,m}? 的形式传递任何惰性量词,其中m是最大值(在这种情况下,{2,4}?中的4)?结果难道不总是与{2,}?相同吗?

在懒惰量词中,是否存在通过传递最大值(例如{2,4}中的4)有用的情况?

免责声明:我实际上是在Vim中使用正则表达式进行搜索(/a{-2,4}),而不是在任何脚本语言中。我认为问题的原理仍然相同。


这取决于正则表达式库/实现。正则表达式语言/编程语言是什么? - Wiktor Stribiżew
1个回答

0

当你需要考虑惰性量词表达式后面的内容时,它就很重要了。惰性用于防止字符被后面的连接中的表达式消耗。考虑字符串aaaaab

  1. 由于a{2,4}匹配的a太多了,所以该字符串不会被a{2,4}?b匹配。
  2. 由于a{2,}?b可以匹配任意数量的a,因此该字符串将被匹配。

在aaaaab的情况下,a{2,4}b会匹配aaaab,对吧?然而,我本来期望a{2,4}?b会匹配aab,但是当我尝试时,它却匹配了aaaab。有趣。 - Iggy
我认为问题在于无论是否懒惰,它仍将从可能的最左边开始。考虑类似于re.match(r'a*(a{2,4}?b)', 'aaaa')的内容。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接