Regex *+;量词是什么?
懒惰和贪婪的概念很容易理解,但我在我的正则表达式(Java)中只见过/使用过一次Regex *+;量词是什么?,regex,quantifiers,Regex,Quantifiers,懒惰和贪婪的概念很容易理解,但我在我的正则表达式(Java)中只见过/使用过一次*+(?!C)*+(A,B,C是任意值),因为当懒惰修饰符导致堆栈溢出错误时,它就起作用了 因为大多数搜索引擎都无法搜索符号,所以我找不到任何关于这方面的文档。那么*+到底做了什么?它是如何做到的?贪婪的量词匹配它能匹配的所有东西,然后模式回溯,直到匹配成功 惰性量词向前跟踪,直到匹配成功 所有格量词尽可能匹配所有事物,从不后退 +表示所有格量词。例如,If可以用作++或*++ 这种防止回溯的能力意味着它可以停止 X
*+
(?!C)*+(A,B,C是任意值),因为当懒惰修饰符导致堆栈溢出错误时,它就起作用了
因为大多数搜索引擎都无法搜索符号,所以我找不到任何关于这方面的文档。那么*+到底做了什么?它是如何做到的?贪婪的量词匹配它能匹配的所有东西,然后模式回溯,直到匹配成功 惰性量词向前跟踪,直到匹配成功 所有格量词尽可能匹配所有事物,从不后退
+
表示所有格量词。例如,If可以用作++
或*++
这种防止回溯的能力意味着它可以停止 X*+表示X,零次或多次(所有格)
所有格量词总是吃掉整个输入字符串,尝试一次(并且只尝试一次)匹配。与贪婪的量词不同,所有格量词从不后退,即使这样做会使整体匹配成功。正如其他答案所指出的,
*+
是一个“所有格量词”,它尽可能多地匹配前一个元素,就像贪婪的量词一样,但从不后退
为什么这有用仅作为性能优化。此外,仅在正则表达式不匹配时作为性能优化。这是了解正则表达式的一个重要方面:它们的最坏性能总是发生在它们不匹配的时候
根据所使用的正则表达式引擎以及正则表达式本身的细节,最坏情况下的性能有时可能非常糟糕。举一个简单的例子,以这个正则表达式为例:a*a*b
,与这个字符串匹配:aaaaaac
面对这种情况,标准的“NFA”型正则表达式引擎将执行以下操作:
a
5次,第二个a
0次,第三个a
0次b
与c
进行匹配——失败a
4次、第二个1次和第三个零次b
——失败a
4次,第2个零次,第3个1次a
3次,第二个2次,第三个零次a*+a*a*b
,那就永远不会发生。这更像是:
a
5次、第二个零次和第三个零次b
——失败a
是“所有格的”,一旦匹配了5次,它就不能尝试匹配更少的次数。由于字符串中没有剩余的a
s可供其他a*
s匹配,因此它们只能匹配零次。没有什么可以尝试的了,所以整个比赛失败了如果答案澄清了您的问题,请不要忘记接受。您的想法是正确的,但您确实需要清理输出。“我不能推翻这个观点。@Mathletics刚刚做到了:)谢谢!为链接到灾难性回溯提供道具,因为这正是发生在我身上的事情。。。我现在知道为什么了!啊,所以所有格量词也会影响后面的量词?它基本上不需要额外的
a*
s来匹配任何东西?不,它不会直接影响后面的量词。但在本例中,它匹配字符串中的所有a
s,因此没有剩余内容可供其他a*
s匹配。这是它“影响”他们的唯一方式。