Javascript正则表达式在大括号之间获取内容(内部带有花括号)

时间:2012-10-27 15:09:22

标签: javascript regex expression brackets

想想这样的字符串:

public function test(data)
{
    if (1 == 2)
    {
        alert("Wtf?");
    }

    switch (data)
    {
        case 'test':
            alert("Test");
        break;
    }
}

我需要解析该字符串,以便我拥有该函数的主体(内容)。

我已经让我的reg exp工作了,所以我有函数的内容,但是当有一个结尾}时。正则表达式停止,内容将如下所示:

if (1 == 2)
{
   alert("Wtf?");

我真的希望有人可以帮助我......

这是我的Reg Exp用于拆分此字符串:

var test = classContent.replace(/(?:(private|public)\s*)function\s*([a-zA-Z0-9_]+)\s*\(([a-zA-Z0-9_\,\s]*)\s*\)\s*{([^}]+)\}/gi, function(a, b, c, d, e) {

    classMethods[c] = {
        visibility : b.trim(),
        params : d.trim(),
        content : e.trim()
    };
});

2 个答案:

答案 0 :(得分:2)

对于正则表达式来说,这通常是一个非常棘手的问题。他们无法很好地处理嵌套结构。有些风格支持递归模式,但在这种情况下即使这样也会有些过分。快速解决您遇到的问题是:

/(?:(private|public)\s*)function\s*([a-zA-Z0-9_]+)\s*\(([a-zA-Z0-9_\,\s]*)\s*\)\s*{(.+)\}/gis

这允许大括号(包括大括号)之间的任何字符,并且因为+是贪婪的,所以这将一直到最后。

但是,如果您的字符串可以包含多个函数,那么这将使您从第一个函数名称转到最后一个结束}。我觉得你就是这种情况,因为你使用了全局修饰符g

如果是这种情况(或者无论如何),请考虑使用不同的方法(即,JavaScript解析器或自己分析字符串并计算大括号)。也许this question会帮助你。

答案 1 :(得分:0)

Javascript不提供PCRE递归参数(?R)

签出Steve Levithan's blog,他写了XRegExp,它取代了大多数缺失的PCRE位。还有一个Match Recursive插件。