gpt4 book ai didi

javascript - 展开循环,什么时候使用

转载 作者:行者123 更新时间:2023-11-29 16:48:59 25 4
gpt4 key购买 nike

我正在尝试了解正则表达式中的展开循环。之间的最大区别是什么:

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

MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d+)[^P]*)(?:[\s\S]*?))PÁG

在这种情况下:

http://regexr.com/3dmlr

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

谢谢。

最佳答案

什么是展开循环

查看此 Unroll the loop technique来源:

This optimisation thechnique is used to optimize repeated alternation of the form (expr1|expr2|...)*. These expression are not uncommon, and the use of another repetition inside an alternation may also leads to super-linear match. Super-linear match arise from the underterministic expression (a*)*.

The unrolling the loop technique is based on the hypothesis that in most case, you kown in a repeteated alternation, which case should be the most usual and which one is exceptional. We will called the first one, the normal case and the second one, the special case. The general syntax of the unrolling the loop technique could then be written as:

normal* ( special normal* )*

因此,这是一种优化技术,其中交替变成线性匹配的原子。

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

当前场景

你的 MINISTÉRIO[\s\S]*?PÁG 是一个非展开模式,而 MINISTÉRIO[^P]*(?:P(?!ÁG)[^P]*)*PÁG 是。请参阅演示(均使用 PCRE 选项保存,以显示上方框中的步骤数。正则表达式引擎的正则表达式性能不同,但这将准确告诉您性能差异)。在 text 之后添加更多文字:第一个正则表达式将开始需要更多步骤才能完成,第二个正则表达式只会在添加 P 后显示更多步骤.因此,在您在已知部分使用的字符不常见的文本中,展开的模式非常有效

参见 Difference between .*? , .* and [^"]*+ quantifiers我回答中的部分以了解延迟匹配的工作原理(您的 [\s\S]*?.*? 相同,在允许 . 匹配换行符的语言中带有 DOTALL 修饰符)。

性能问题

惰性匹配模式总是很慢且效率低下吗?并非总是如此。对于非常短的字符串,惰性点匹配通常更好(1-10 个符号)。当我们谈论长输入时,可能有前导定界符而没有尾随定界符,这可能会导致过度回溯,从而导致超时问题。

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

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

奖励:通常展开的模式

  1. Tempered greedy tokens

  2. 常规字符串文字 ( "String\u0020:\"text\"" ): "[^"\\]*(?:\\.[^"\\]*)*"

  3. 多行注释正则表达式 ( /* Comments */ ): /\*[^*]*\*+(?:[^/*][^*]*\*+)*/

  4. @<...>@评论正则表达式: @<[^>]*(?:>[^@]*)*@

关于javascript - 展开循环,什么时候使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com