Javascript 展开循环,何时使用

Javascript 展开循环,何时使用,javascript,regex,Javascript,Regex,我试图理解正则表达式中的展开循环。以下两者之间的最大区别是什么: MINISTÉRIO[\s\S]*?PÁG 及 在这方面: 如果第一个做同样的事情,我为什么要用第二个呢 谢谢。什么是展开循环 见此来源: 此优化技术用于优化表单的重复交替(expr1 | expr2 |…)*。这些表达式并不少见,在交替中使用另一个重复也可能导致超线性匹配。超线性匹配源于欠端表达式(a*)* 展开循环技术是基于这样一个假设,即在大多数情况下,你知道在重复的交替中,哪种情况应该是最常见的,哪种情况是例外的。我们

我试图理解正则表达式中的展开循环。以下两者之间的最大区别是什么:

MINISTÉRIO[\s\S]*?PÁG

在这方面:

如果第一个做同样的事情,我为什么要用第二个呢

谢谢。

什么是展开循环 见此来源:

此优化技术用于优化表单的重复交替
(expr1 | expr2 |…)*
。这些表达式并不少见,在交替中使用另一个重复也可能导致超线性匹配。超线性匹配源于欠端表达式
(a*)*

展开循环技术是基于这样一个假设,即在大多数情况下,你知道在重复的交替中,哪种情况应该是最常见的,哪种情况是例外的。我们将第一种情况称为正常情况,第二种情况称为特殊情况。展开循环技术的一般语法可以写成:

正常*(特殊正常*)*

所以,这是一种优化技术,交替变成线性匹配的原子

这使得这些展开模式非常有效,因为它们涉及较少的回溯

当前情景 您的是非展开模式,而不是展开模式。请参阅演示(均使用PCRE选项保存,以显示上面框中的步骤数。不同的正则表达式引擎的正则表达式性能不同,但这将准确地告诉您性能差异)。在
text
之后添加更多文本:第一个正则表达式将开始需要更多步骤才能完成,第二个正则表达式仅在添加
P
后显示更多步骤。因此,在已知部分中使用的字符不常见的文本中,展开模式非常有效

请参阅我的答案中的部分,了解惰性匹配是如何工作的(您的
[\s\s]*?
*?
相同,在允许
匹配换行符的语言中使用了DOTALL修饰符)

性能问题 惰性匹配模式是否总是缓慢而低效?事实并非总是如此。对于非常短的字符串,延迟点匹配通常更好(1-10个符号)。当我们讨论长输入时,可以有前导分隔符,而没有尾随分隔符,这可能会导致过度回溯,从而导致超时问题

当您有可能很长的任意输入且可能没有匹配项时,请使用展开模式。

使用惰性匹配当您的输入受到控制时,您知道总会有匹配、某些已知的设置日志格式等。

奖励:通常展开的模式
  • 常规字符串文本(
    “string\u0020:\“text\”
    ):

  • 多行注释正则表达式(
    /*Comments*/
    ):

  • @
    注释正则表达式:


  • 他们不会做同样的事情。你认为他们为什么这样做?你能在我提供的链接中检查这两个吗?你能给我解释一下区别吗?如何使用展开卷边?为了什么目的?谢谢第一个匹配
    MINISTÉRIO PÁG
    ,第二个不匹配。我不知道你说的“展开循环”是什么意思。现在我明白了!谢谢你,维克托:)我补充了更多。通常情况下,行为是相似的:展开的模式更快、更可靠,因为当模式与字符串不匹配时,它们会更优雅地失败。Ok。非常感谢您的帮助
    MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d+)[^P]*)(?:[\s\S]*?))PÁG