Hows做正则表达式:/.+?/工作?

Ton*_*ark 3 regex

怎么会'.+?' 正规表达工作?.+部分是否匹配任何内容,以及?部分说它可以在那里吗?因此,例如,此正则表达式将匹配:

'cat'
''(即没有写,只是空字符串)

Han*_*ing 10

"+?" 不是"+"量词后跟"?" 量词.取而代之的是"?" 修改"+"以执行"懒惰"或"非贪婪"匹配,这意味着匹配的最少字符数已足够.

那么"a +?" 正则表达式只匹配"caaat"中的单个"a".


Gum*_*mbo 8

除了汉斯·凯斯汀(Hans Kesting)已经说过的话,一个惰性乘法器将完成正常贪心乘数的精确对数:可能的匹配保持尽可能小,并测试正则表达式的其余部分.

因此,如果您正在使用字符串aabaa.*b在其上测试正则表达式,则内部处理步骤如下:

  1. a在比赛中a.*baaba
  2. .*在比赛中,因为是贪婪的 a.*baaba.*
    1. .* 然后匹配 aaba
    2. .* 然后匹配 aaba
  3. ba.*b因为没有留下一封信失败
    • 回溯进了一步回来,.*现在将只匹配bbaaba
  4. ba.*b仍然失败aaba
    • 回溯进了一步回来,.*现在只匹配baaba
  5. ba.*b现在比赛b中,我们就大功告成了.aaba

所以完全匹配是.aaba

如果我们对惰性乘数(a.*?b)执行相同操作,则处理将执行oposite,尝试尽可能匹配尽可能少的字符:

  1. a在比赛中a.*?baaba
  2. .*在没有匹配(=零或更多重复),并且因为被声明为lazy(),正则表达式的其余部分被测试a.*?b*.*.*?
  3. ba.*?b失败的aaba
    • 回溯将尝试增加匹配 .*
  4. .* 现在比赛 aaba
  5. ba.*?b比赛中,我们已经完成了.aaba

所以完全匹配如果.aaba