正则表达式超时

时间:2017-03-21 10:20:25

标签: javascript regex

我试图使用正则表达式从某些代码中提取代码块,但是当在代码中缺少大括号时,我的浏览器阻止了无限循环。 这是我的正则表达式和没有大括号的代码示例

if\s*([A-z0-9]+)?\s*\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\{(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\}

示例:

if(true){
    if(true){

    }


if(true){
}

如果可能的话,如何防止浏览器超时。

2 个答案:

答案 0 :(得分:0)

要间接回答,您可以先进行第一次检查以检查括号计数。但是,注释或字符串中的括号可能会使其变得混乱,这对于语法上有效的输入以及您的示例都是如此。 (我的第一直觉是,这感觉有点像“从不使用正则表达式解析HTML”对话,但我可能是错的。)

答案 1 :(得分:0)

除非你正在处理的输入非常“常规”,否则正则表达式对你没有帮助。你不能表达必须匹配parantheses的事实,例如在一个简单的正则表达式中。

如果您正在解析的代码足够简单,您可以使用自己的解析器,只知道它所需的结构,以便进行所需的提取。你还没有提到你试图解析的语言,但是从“javascript”标签我会把它变成javascript。它可能比C / C ++等更好地工作。否则,你需要查看一些已经可用的解析,这将产生一个AST或类似的,并从那里开始工作。