Regex *+;量词是什么?

Regex *+;量词是什么?,regex,quantifiers,Regex,Quantifiers,懒惰和贪婪的概念很容易理解,但我在我的正则表达式(Java)中只见过/使用过一次*+(?!C)*+(A,B,C是任意值),因为当懒惰修饰符导致堆栈溢出错误时,它就起作用了 因为大多数搜索引擎都无法搜索符号,所以我找不到任何关于这方面的文档。那么*+到底做了什么?它是如何做到的?贪婪的量词匹配它能匹配的所有东西,然后模式回溯,直到匹配成功 惰性量词向前跟踪,直到匹配成功 所有格量词尽可能匹配所有事物,从不后退 +表示所有格量词。例如,If可以用作++或*++ 这种防止回溯的能力意味着它可以停止 X

懒惰和贪婪的概念很容易理解,但我在我的正则表达式(Java)中只见过/使用过一次
*+
(?!C)*+(A,B,C是任意值),因为当懒惰修饰符导致堆栈溢出错误时,它就起作用了


因为大多数搜索引擎都无法搜索符号,所以我找不到任何关于这方面的文档。那么*+到底做了什么?它是如何做到的?

贪婪的量词匹配它能匹配的所有东西,然后模式回溯,直到匹配成功

惰性量词向前跟踪,直到匹配成功

所有格量词尽可能匹配所有事物,从不后退

+
表示所有格量词。例如,If可以用作
++
*++


这种防止回溯的能力意味着它可以停止

X*+表示X,零次或多次(所有格)


所有格量词总是吃掉整个输入字符串,尝试一次(并且只尝试一次)匹配。与贪婪的量词不同,所有格量词从不后退,即使这样做会使整体匹配成功。

正如其他答案所指出的,
*+
是一个“所有格量词”,它尽可能多地匹配前一个元素,就像贪婪的量词一样,但从不后退

为什么这有用作为性能优化。此外,仅在正则表达式不匹配时作为性能优化。这是了解正则表达式的一个重要方面:它们的最坏性能总是发生在它们不匹配的时候

根据所使用的正则表达式引擎以及正则表达式本身的细节,最坏情况下的性能有时可能非常糟糕。举一个简单的例子,以这个正则表达式为例:
a*a*b
,与这个字符串匹配:
aaaaaac

面对这种情况,标准的“NFA”型正则表达式引擎将执行以下操作:

  • 尝试匹配第一个
    a
    5次,第二个
    a
    0次,第三个
    a
    0次
  • 尝试将
    b
    c
    进行匹配——失败
  • “回溯”并匹配第一个
    a
    4次、第二个1次和第三个零次
  • 再次尝试匹配
    b
    ——失败
  • 再次回溯,尝试第1个
    a
    4次,第2个零次,第3个1次
  • 回溯,尝试第一个
    a
    3次,第二个2次,第三个零次
  • (我想你可以自己填写接下来的几百个步骤。)

    如果正则表达式是
    a*+a*a*b
    ,那就永远不会发生。这更像是:

  • 尝试匹配第一个
    a
    5次、第二个零次和第三个零次
  • 尝试匹配
    b
    ——失败
  • 因为第一个
    a
    是“所有格的”,一旦匹配了5次,它就不能尝试匹配更少的次数。由于字符串中没有剩余的
    a
    s可供其他
    a*
    s匹配,因此它们只能匹配零次。没有什么可以尝试的了,所以整个比赛失败了
  • 没有第四步。你完了。当你的朋友在等待他们的regexp完成执行时,你可以放松一下,打开你选择的冷饮

  • 如果答案澄清了您的问题,请不要忘记接受。您的想法是正确的,但您确实需要清理输出。“我不能推翻这个观点。@Mathletics刚刚做到了:)谢谢!为链接到灾难性回溯提供道具,因为这正是发生在我身上的事情。。。我现在知道为什么了!啊,所以所有格量词也会影响后面的量词?它基本上不需要额外的
    a*
    s来匹配任何东西?不,它不会直接影响后面的量词。但在本例中,它匹配字符串中的所有
    a
    s,因此没有剩余内容可供其他
    a*
    s匹配。这是它“影响”他们的唯一方式。