我想匹配 JavaScript 文件中的所有块注释和多行注释(这些是 C 风格注释)。我有一个效果很好的模式。然而,它会产生一些回溯,从而显着减慢速度,尤其是在较大的文件上。
图案:\/\*(?:.|[\r\n])*?\*\/|(?:\/\/.*)
例子:https://www.regex101.com/r/pR6eH6/2 https://www.regex101.com/r/pR6eH6/2
怎样才能避免走回头路呢?
由于交替,你会出现严重的回溯。而不是(?:.|[\r\n])
,您可以考虑使用字符类[\s\S]
显着提高性能:
\/\*[\s\S]*?\*\/|\/\/.*
See demo https://www.regex101.com/r/bY3sJ9/1
在 Python 中,您可以使用re.S
/re.DOTALL
修改器使.
也匹配换行符(请注意,单行注释模式应与\/\/[^\r\n]*
then):
/\*.*?\*/|//[^\r\n]*
See 另一个演示 https://www.regex101.com/r/pX0fC6/2
However, since *?
惰性量词也会导致类似于贪婪量词引起的开销,您应该考虑使用更优化的模式C风格多行注释 https://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890 - /\*[^*]*\*+(?:[^/*][^*]*\*+)*/
,整个正则表达式现在看起来像:
/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//.*
See 另一个演示 https://www.regex101.com/r/pX0fC6/2
Details:
-
/\*
- a /*
-
[^*]*
- 零个或多个字符以外的字符*
-
\*+
- 一个或多个星号
-
(?:[^/*][^*]*\*+)*
- zero or more sequences of:
-
[^/*]
- 符号以外的符号/
and *
-
[^*]*
- 零个或多个符号以外的符号*
-
\*+
- 1+ 星号
-
/
- a /
symbol
-
|
- or
-
//.*
- //
以及除换行符之外的任何 0+ 字符。
只是想注意,在Python中,你不需要转义/
(在JS中,你不需要转义/
使用 RegExp 构造函数声明正则表达式时)。
NOTE:最后一个模式不允许简单地捕获里面的内容/*
and */
,但由于该模式比其他模式更稳定,因此即使您需要捕获带有尾随的内容,我也建议使用它*
- /\*([^*]*\*+(?:[^/*][^*]*\*+)*)/|//(.*)
- 然后你需要删除最后一个字符.group(1)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)