正则表达式,不能使用

时间:2013-06-10 06:39:19

标签: regex

我希望从源代码中提取类似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引擎无法解决它? 是否存在一些无法使用的正则表达式(语法正确,我认为)?

3 个答案:

答案 0 :(得分:5)

这称为Catastrophic Backtracking。你的正则表达式必须检查很多可能性,因为你正在嵌套量词:

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

更好的方法是:

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

here in action

您需要s选项才能使.与换行符匹配,m选项可使^与行的开头匹配。

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

答案 1 :(得分:2)

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*) 

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

答案 2 :(得分:1)

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

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

如果你的正则表达式不支持原子组和占有量词,请使用:

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