Regex 正则表达式:/.+;?/工作

Regex 正则表达式:/.+;?/工作,regex,Regex,“+?”正则表达式如何工作?.+部分是否与所写内容匹配,以及?部分是说它要么存在要么不存在?例如,这个正则表达式将匹配: “猫” ''(即,没有写入任何内容,只有空字符串)+?(lazy plus) 重复上一项一次或多次 更多懒惰,所以引擎第一 仅与上一项匹配一次, 在尝试使用ever进行排列之前 增加前面的匹配项 项目 /“+?”/匹配abc“def”“ghi”jkl中的“def”(和“ghi”),而/“+”/匹配“def”“ghi” 您可以找到更多信息“+?”不是后跟“+”量词的“+”量词。

“+?”正则表达式如何工作?.+部分是否与所写内容匹配,以及?部分是说它要么存在要么不存在?例如,这个正则表达式将匹配:

“猫”
''(即,没有写入任何内容,只有空字符串)

+?(lazy plus)

重复上一项一次或多次 更多懒惰,所以引擎第一 仅与上一项匹配一次, 在尝试使用ever进行排列之前 增加前面的匹配项 项目

/“+?”/
匹配abc“def”“ghi”jkl中的“def”(和“ghi”),而
/“+”/
匹配“def”“ghi”

您可以找到更多信息

“+?”不是后跟“+”量词的“+”量词。而是“?”修改“+”以执行“惰性”或“非贪婪”匹配,这意味着匹配的字符数已经足够了


因此,一个“a+?”正则表达式将只匹配“caaat”中的一个“a”。

除了Hans Kesting已经说过的,一个懒惰的乘法器将与正常的贪婪乘法器完全相同:可能的匹配将保持尽可能小,其余的正则表达式将被测试

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

  • a
    中的
    a
    *b
    匹配
    a
    aba
  • *
    a
    *
    b
    中,匹配
    a
    ,并且由于
    */code>是贪婪的
    
  • *
    然后匹配
    a
    ab
    a
  • *
    然后匹配
    a
    aba
  • a.*
    b
    中的
    b
    失败,因为没有剩余的字母
    • 回溯向后退一步,
      *
      现在只匹配
      a中的
      bb
      ab
      a
  • b
    a.*
    b
    中,在
    aab
    a
    • 回溯返回一步,
      *
      现在只匹配
      a
      a
  • b
    a.*
    b
    现在匹配
    aa
    b
    中的
    b
    a
    ,我们完成了
  • 因此,完全匹配是
    aab
    a

    如果我们对惰性乘法器(
    a.*b
    )执行相同的操作,则处理将执行以下操作:尽量匹配尽可能少的字符:

  • a
    中的
    *?b
    匹配
    a
    aba
  • *
    a
    *
    中,b
    不匹配任何内容(
    *
    =零次或多次重复),并且由于
    *
    被声明为惰性(
    *?
    ),因此对正则表达式的其余部分进行测试
  • a.*
    中的
    a
    a
    • 回溯将尝试增加
      *
  • *
    现在匹配
    a
    a
  • b
    a.*.
    b
    匹配
    aa
    b
    a
    ,我们完成了

  • 因此完全匹配如果
    aab
    a

    有关于Perl如何处理这些量词的文档

    默认情况下,量化的子模式是“贪婪的”,也就是说,它将尽可能多地匹配(给定特定的起始位置),同时仍然允许模式的其余部分匹配。如果您希望它匹配尽可能少的次数,请在量词后面加一个“
    ”。请注意,含义不会改变,只是“贪婪”:
    正如我们所知,如果最终报价不匹配,回溯将无济于事。有关详细信息,请参见独立子表达式
    (?>…)
    ;所有格量词只是该结构的句法糖分。例如,上面的例子也可以写成如下:
    
    /"(?>(?:(?>[^"\\]+)|\\.)*)"/
    

    正则表达式不可避免地要查找至少一个字符。我遇到过这样的情况:空字符串无法通过测试,最好使用
    *?
    (*)?
    相反,有时您必须在问号前的大括号中指定字符串中可能为空的部分,这会有所帮助。例如,
    \d{6}?
    将产生错误的结果,而如果我在字符串中说了
    (\d{6})
    ,例如:

    preg_match("/shu\.(\d{6})?/", "shu.321456")
    

    这将产生
    true
    ,字符串
    “shu.”
    在句点后没有任何int

    最初的例子中的引号让我感到困惑——我以为它们只是从文本中设置了模式,而不是模式的一部分。我认为添加斜线可以澄清意图。正如Svish显然编辑的那样,/+?“/将同时匹配“def”和“ghi”,对吗?分别地因此它将返回两个表达式。而/“+”/捕获了整个短语“def”“ghi”,将def”“ghi计算为.+部分?@hatorade,据我所知,在RegexBuddy中测试它,是的。@Svish我在python和?似乎只是返回“def”,没有提及 *+ Match 0 or more times and give nothing back ++ Match 1 or more times and give nothing back ?+ Match 0 or 1 time and give nothing back {n}+ Match exactly n times and give nothing back (redundant) {n,}+ Match at least n times and give nothing back {n,m}+ Match at least n but not more than m times and give nothing back 'aaaa' =~ /a++a/ /"(?:[^"\\]++|\\.)*+"/ /"(?>(?:(?>[^"\\]+)|\\.)*)"/
    preg_match("/shu\.(\d{6})?/", "shu.321456")