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

DoL*_*Sky 5 ruby regex ruby-1.9.3

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

  • ?,??并且?+所有匹配0或1次.
  • *,*? and*+`全部匹配0次或更多次.
  • +,+?并且++所有匹配1次或更多次.

  • ?,*并且+贪婪的.
  • ??,*?并且+?勉强/懒惰.
  • ?+,*+++占有欲.

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

Tim*_*ker 7

拿绳子

aaaab
Run Code Online (Sandbox Code Playgroud)

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

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!>
Run Code Online (Sandbox Code Playgroud)

说明:

  • a?试图匹配一个a,但如果整场比赛必须成功,它就准备好了.
  • a??尝试不匹配任何东西,但a如果整场比赛必须成功,它就准备匹配一个.
  • a?+试图匹配一个a.如果它可以做到这一点,它将不会退回以匹配任何内容,如果这对于整体匹配成功是必要的.如果它不能匹配a,那么它很乐意与之匹敌.
  • a*尝试匹配尽可能多的as,但它准备匹配更少的as,即使没有,如果整个匹配成功所必需的.
  • a*?尝试不匹配,但它准备匹配尽可能多的as,以便整场比赛成功,但不是更多.
  • a*+尝试匹配尽可能多的as.如果它可以做到这一点,它将不会退回以匹配更少的as,如果整体匹配成功所必需的.如果它甚至不能匹配a,那么它很乐意与之匹敌.
  • a+尝试匹配尽可能多的as,但它准备匹配更少的as(但至少一个),如果整个匹配成功所必需的.
  • a+?尝试只匹配一个a,但它准备匹配尽可能多的as,以便整个比赛成功,但不是更多.
  • a++尝试匹配尽可能多的as.如果它可以做到这一点,它将不会退回以匹配更少的as,如果整体匹配成功所必需的.如果它甚至不匹配a,则正则表达式失败.