1

我想从源代码中提取类似 C 的评论,fe 来自

(更新示例)

/**
 * 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]*)*\*\/

问题是这个正则表达式停止(杀死)正则表达式引擎。RegexCouch 变得不负责任,在浏览器中使用会导致页面不负责任。

这个正则表达式有什么问题?怎么可能,那个正则表达式引擎不能解决它?是否有一些无法使用的正则表达式(我认为语法正确)?

4

3 回答 3

5

这称为灾难性回溯。您的正则表达式必须检查许多可能性,因为您正在嵌套量词:

^\s*\/\*(.*[\r\n]*)*\*\/
         ^^      ^ ^

更好的方法是:

/^\s*\/\*.*?\*\//gms

在这里查看它的实际应用

您需要s使.匹配成为换行符的m选项,使匹配成为行首的选项^

.*?匹配尽可能少的字符。

于 2013-06-10T06:45:29.403 回答
2
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*) 

这将适用于类似 c 的评论匹配

于 2013-06-10T06:45:41.560 回答
1

如果你使用类似 pcre 的正则表达式,你可以使用这个:

\s*+\/\*(?>[^*]++|\*++(?!\/))*\*\/

如果您的正则表达式风格不支持原子组和所有格量词,请使用:

\s*\/\*(?:[^*]+|\*+(?!\/))*\*\/
于 2013-06-10T07:00:56.583 回答