gpt4 book ai didi

javascript - 使用 Regex 解析 C 风格的注释,避免回溯

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:14 27 4
gpt4 key购买 nike

我想匹配 JavaScript 文件中的所有 block 注释和多行注释(这些是 C 风格的注释)。我有一个很好用的模式。但是,它会产生一些回溯,这会显着降低速度,尤其是在处理较大的文件时。

模式:\/\*(?:.|[\r\n])*?\*\/|(?:\/\/.*)

示例:https://www.regex101.com/r/pR6eH6/2

如何避免回溯?

最佳答案

由于交替,您有大量的回溯。代替 (?:.|[\r\n]),您可以考虑使用字符类 [\s\S] 来显着提高性能:

\/\*[\s\S]*?\*\/|\/\/.*

参见 demo

在 Python 中,您可以使用 re.S/re.DOTALL 修饰符来使 . 也匹配换行符(注意单行注释模式应该匹配 \/\/[^\r\n]* then):

/\*.*?\*/|//[^\r\n]*

参见 another demo

但是,由于 *? lazy quantifier 也会导致与贪婪量词类似的开销,您应该考虑使用C style multiline comments 的最佳模式- /\*[^*]*\*+(?:[^/*][^*]*\*+)*/,整个正则表达式现在看起来像:

/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//.*

参见 yet another demo

详细信息:

  • /\* - 一个/*
  • [^*]* - *
  • 以外的零个或多个字符
  • \*+ - 一个或多个星号
  • (?:[^/*][^*]*\*+)* - 零个或多个序列:
    • [^/*] - /*
    • 以外的符号
    • [^*]* - *
    • 以外的零个或多个符号
    • \*+ - 1+ 个星号
  • / - / 符号
  • | - 或
  • //.* - // 和除换行符以外的任何 0+ 个字符。

只是想注意,在 Python 中,你不需要转义 /(在 JS 中,你不需要在使用 RegExp 声明正则表达式时转义 /构造函数)。

注意:最后一个模式不允许简单地捕获 /**/ 中的内容,但由于该模式更稳定与其他相比,即使您需要使用尾随 * - /\*([^*]*\*+(?:[^/*][^*]*\*+)*)/|//(.*) - 然后您需要从 .group(1) 中删除最后一个字符>.

关于javascript - 使用 Regex 解析 C 风格的注释,避免回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087560/

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