我希望从源代码中提取类似C的注释。从
(更新示例)
/**
* base comment
* (c) SOMEBODY SOMETIME
* something
*/
///<!-- ------metadata-XML------- -->
/// <module type="javascript"> A
///<desc> some desc
/// </desc>
(function( a /* param A */) { // programmers comment ... enclosure
/*! user doc
this module ....
* reguired
.....
*/
var b={}; // programmers in line comment
// single line comments
// The cookie spec says up to 4k per cookie, so at ~50 bytes per entry
// that gives a maximum of around 80 items as a max value for this field
b.a=a;
var str = " tttt \/\/this is not comment ! tttt "
var str2 = " tttt \/\* this is not comment too ! \
.............. \*\/ ttt ";
global.b = b;
}(global);
///</module>
我使用的正则表达式是
^\s*\/\*(.*[\r\n]*)*\*\/
问题是这个regexp停止(杀死)regexp引擎。 RegexCouch变得不负责任, 在浏览器中使用会导致不负责任的页面。
这个正则表达式有什么问题?怎么可能,regexp引擎无法解决它? 是否存在一些无法使用的正则表达式(语法正确,我认为)?
答案 0 :(得分:5)
这称为Catastrophic Backtracking。你的正则表达式必须检查很多可能性,因为你正在嵌套量词:
^\s*\/\*(.*[\r\n]*)*\*\/
^^ ^ ^
更好的方法是:
/^\s*\/\*.*?\*\//gms
您需要s
选项才能使.
与换行符匹配,m
选项可使^
与行的开头匹配。
.*?
匹配尽可能少的字符。
答案 1 :(得分:2)
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
这适用于类似c的评论匹配
答案 2 :(得分:1)
如果你使用类似pcre的正则表达式,你可以使用它:
\s*+\/\*(?>[^*]++|\*++(?!\/))*\*\/
如果你的正则表达式不支持原子组和占有量词,请使用:
\s*\/\*(?:[^*]+|\*+(?!\/))*\*\/