想像这样的字符串:

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()
    };
});

最佳答案

对于正则表达式来说,这通常太难了。他们不能真正很好地处理嵌套结构。一些口味支持递归模式,但是在这种情况下,即使这样也会过分杀伤力。解决您给定问题的方法是:

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


这允许在大括号(包括大括号)之间包含任何字符,并且由于+是贪婪的,因此将一直进行到结尾。

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

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

09-16 17:54