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

时间:2013-01-15 20:06:45

标签: ruby regex ruby-1.9.3

以下量词如何区别 - 关于场景,速度等

  • ????+都匹配 0或1次
  • **? and * +`全部匹配 0次或更多次
  • ++?++都匹配 1次或更多次

  • ?*+ 贪婪
  • ??*?+? 不情愿/懒惰
  • ?+*+++ 占有

任何人都可以帮我理解这些术语的含义吗?为什么同一个工作的每个量词有三种变体?

1 个答案:

答案 0 :(得分: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 s,但它已准备好匹配更少的a s,即使没有,如果整场比赛必须成功。
  • a*?尝试不匹配,但它准备匹配尽可能多的a,这是绝对必要的,以便整场比赛成功,但不会更多。
  • a*+尝试尽可能多地匹配a个。如果它能够做到这一点,那么如果整体匹配成功所必需的话,它将返回以匹配更少的a s。如果它甚至不能与单个a匹配,那么它很乐意与之匹敌。
  • a+尝试匹配尽可能多的a,但如果整场比赛必须成功,那么它准备匹配更少a个(但至少一个)
  • a+?尝试只匹配一个a,但它准备匹配尽可能多的a,这是绝对必要的,以便整个匹配成功,但不是更多。
  • a++尝试尽可能多地匹配a个。如果它能够做到这一点,那么如果整体匹配成功所必需的话,它将返回以匹配更少的a s。如果它甚至不能与单个a匹配,则正则表达式失败。