1

次のような文字列を考えてください。

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

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

その文字列を解析して、その関数の本体 (コンテンツ) を取得する必要があります。

関数の内容を取得できるように、正規表現は既に機能していますが、末尾が } の場合。正規表現が停止し、コンテンツは次のようになります。

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

誰かが私を助けてくれることを本当に願っています..

これは、この文字列を分割するための私の正規表現です:

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

2 に答える 2

2

これは通常、正規表現では難しすぎる問題です。ネストされた構造をうまく処理できません。一部のフレーバーは再帰パターンをサポートしていますが、この場合はこれでもやり過ぎです。与えられた問題の簡単な修正は次のとおりです。

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

これにより、中かっこ (中かっこを含む) の間の任意の文字が許可されます+

ただし、文字列に複数の関数を含めることができる場合、これにより、最初の関数名から最後の終了まですべてが取得されます}。グローバル修飾子を使用したため、これがあなたに当てはまると思いますg

この場合 (またはとにかく)、別のアプローチ (つまり、JavaScript パーサーを使用するか、自分で文字列を分析して中かっこを数えること) を使用することを検討してください。たぶん、この質問はあなたを助けるでしょう。

于 2012-10-27T15:13:13.667 に答える
0

Javascript は PCRE 再帰パラメーターを提供しません(?R)

Steve Levithan のブログをチェックしてください。彼はXRegExpを書きました。これは、欠落している PCRE ビットのほとんどを置き換えます。Match Recursiveプラグインもあります。

于 2012-10-27T15:23:22.600 に答える