懒惰、贪婪和占有量词之间有什么区别?

3
以下量词在方案、速度等方面有何不同?
- `?`、`??` 和 `?+` 都匹配0或1次。 - `*`、`*?` 和 `*+` 都匹配0或多次。 - `+`、`+?` 和 `++` 都匹配1或多次
`?`、`*` 和 `+` 是贪婪型的。 `??`、`*?` 和 `+?` 是懒惰/勉强型的。 `?+`、`*+` 和 `++` 是占有型的。
这些术语的含义是什么?为什么在执行相同任务时有三种变体的量词?

2
为什么?因为有人在某处使用它们吗?你真的需要花时间阅读正则表达式文档,并尝试使用IRB或rubular.com,看看它们是如何工作的,并记住你学到的东西。学习编程的很多内容都是通过实验来观察微小变化的影响,而不是询问别人解释这些事情。 - the Tin Man
http://www.regular-expressions.info/possessive.html - Phrogz
@TimPietzcker 感谢您对我投票。对我来说并不重要,但是下投票会导致 新帖子 被锁定 - 我认为这是致命的。我对此类投票不感兴趣,但是我太喜欢像你这样具有敏锐概念的人们,拥有这样的想法了。但是,最近几天我看到一些 SO 用户非常热衷于对他人进行 down vote,而不知道问题的重要性。如果您不理解我的 帖子,那没关系。但是当答案已经发布并且答案非常有知识性时,为什么不回来给那些下投票的人点赞呢? - DoLoveSky
我相信“好的回答从来不会出现在好的帖子之前”。但对于我的情况来说,这并没有发生。 - DoLoveSky
1个回答

7

请看以下字符串:

aaaab

然后看看以下正则表达式如何匹配它:

Regex          Submatches
               group 1  group 2  group3
(a?)(a*)(ab)   a        aa       ab
(a??)(a*)(ab)           aaa      ab
(a?+)(a*)(ab)  a        aa       ab
(a*)(a?)(ab)   aaa               ab
(a*?)(a?)(ab)  aa       a        ab
(a*+)(a?)(ab)  aaaa              <Match fails!>
(a+)(a*)(ab)   aaa               ab 
(a+?)(a*)(ab)  a        aa       ab
(a++)(a*)(ab)  aaaa              <Match fails!>
  • a?尝试匹配一个a,但它准备好在必要时匹配空字符以使整个匹配成功。
  • a?? 尝试匹配空字符,但它准备好在必要时匹配一个a以使整个匹配成功。
  • a?+ 尝试匹配一个 a。如果它能做到这一点,它将不会放弃匹配空字符,即使这是为了整个匹配成功而必须的。如果无法匹配 a,它将乐意匹配空字符串。
  • a* 尝试匹配尽可能多的 a,但准备好匹配更少的 a,甚至空字符,如果这对于整个匹配来说是必要的。
  • a*? 尝试匹配空字符,但它准备好仅匹配绝对必要的 a 以使整个匹配成功,但不会超过最大次数。
  • a*+ 尝试匹配尽可能多的 a。如果它能做到这一点,它将不会放弃匹配更少的 a,即使这是为了整个匹配成功而必须的。如果无法匹配任何 a,它将乐意匹配空字符串。
  • a+ 尝试匹配尽可能多的 a,但准备好匹配更少的 a(但至少一个),如果这对于整个匹配来说是必要的。
  • a+? 尝试仅匹配一个a,但它准备好仅匹配绝对必要的 a 以使整个匹配成功,但不会超过最大次数。
  • a++ 尝试匹配尽可能多的 a。如果它能做到这一点,它将不会放弃匹配更少的 a,即使这是为了整个匹配成功而必须的。如果无法匹配任何 a,则正则表达式失败。

终于有一个全面的解释,超越了通常的“一个或多个等”,“贪婪/非贪婪”。太好了! - BernardK
@tim 太棒了!你给的解释非常精彩!我喜欢它!点赞!:) +1 给你! - DoLoveSky
@DoLoveSky,请不要为了赞而进行恶意攻击。请参考http://stackoverflow.com/faq#reputation,了解如何在不乞求的情况下获得声望值的解释。 - the Tin Man
@DoLoveSky:在你提问之前,我已经给你点赞了。不要太担心他们的看法。把这份精力用来提出更好的问题吧(例如,正确的拼写和语法确实很重要)。 - Tim Pietzcker
1
第五个正则表达式的子匹配是否真的正确?Python语句re.search(r'(a*?)(a?)(ab)', 'aaaab').groups()返回结果为('aa', 'a', 'ab')。https://regex101.com/证实了这一点。 - user9611000
显示剩余3条评论

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