2

カウントがいくつあるかは私にはあまり関係ないので、カウントが正しい単語であるかどうかはわかりませんが、説明させてください。私のデータは次のようにフォーマットされます:(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)そして、いくつの次元があるかを制御することはできません。
["hi", Array[], "hey"]そして、最下位のグループを取得したい["yo", Array[], "howdy"]ので、「カウント」する方法があれば、開いた括弧をカウントしてから、閉じた括弧をカウントし、0に達すると、正規表現が終了します。例えば:

(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)
1---2---1----0-1---2--3----2--1------0

そうは言っても、数えることはできないと思いますが、私が欲しいのは代替の解決策です。これは私がこれまでに持っているものですが、それ/\([^\(]*?\)/は低レベルのグループ別名(1,2)とのそれぞれから最高レベルのグループを返すだけ(rawr)です。

4

4 に答える 4

3

スタックを使用して、(およびを追跡できます)

Array.reduce(
    '(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)',
    function(x,y){
        if(y=='(')
            return [x[0]+1, x[1]+(x[0]+1)]
        else if(y==')')
            return [x[0]-1, x[1]+(x[0]-1)]
        else
            return [x[0], x[1]+'-']
    },
    [0,'']
)[1]

firebugコンソールで試してみてください。

于 2012-09-07T00:43:56.570 に答える
0

これは、元のユースケースと@Barmarのユースケースで機能します。本当に必要な場合は、括弧がカウントされます...

また、万が一の場合に備えて、データ文字列全体に任意のスペースを追加しました(受信データを制御できないため)

var results = [];
var dataString = "(hi, (1,2) , hey), ( yo,( 3, ( rawr   ), 4) ,   howdy  )";
//var dataString = "(hi, (1 , 2 ), (3, 4),   hey), (yo ,(3,(rawr ), 4), howdy)";


var dataSplit = dataString.split(",");

var trimRegex = /^\s+|\s+$/g;
var openParensRegex = /\(/;
var closeParensRegex = /\)/;
var parensRegex = /\(|\)/;

var parensCount = 0;

for (var x = 0, lenx = dataSplit.length; x < lenx; x++){
    var cleanString = dataSplit[x].replace(trimRegex, "");

    if (openParensRegex.test(cleanString)){ parensCount++; };

    if (parensCount < 2){
        results.push(cleanString.replace(parensRegex, "").replace(trimRegex, ""));
    };

    if (closeParensRegex.test(cleanString)){ parensCount--; };
};

console.log(results);

お役に立てば幸いです。

于 2012-09-07T01:23:47.667 に答える
0

次のスクリプトが役立つ場合があります。括弧レベルを識別します。

var string="(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)",i=0;
while (string.indexOf("(")>=0) {
    i++;
    string=string.replace(/\(([^()]+)\)/g,"|l"+i+"|$1|l"+i+"|");
}

結果:| l2 | hi、| l1 | 1,2 | l1 |、hey | l2 |、| l3 | yo、| l2 | 3、| l1 | rawr | l1 |、4 | l2 |、howdy | l3 |

フィドル: http: //jsfiddle.net/GfUZh/

于 2012-09-07T15:54:24.450 に答える
-1

最高レベルを取得したい場合は、この場合は交点を見つけることで正規表現を使用して行うことができます),(

var str = '(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)';
var re = /(\(.+\)),(\(.+\))/;
var results = re.exec(str);
results.shift(); // remove first item which is useless
console.log(results); //=> ["(hi,(1,2),hey)", "(yo,(3,(rawr),4),howdy)"]

デモ: http: //jsfiddle.net/elclanrs/fFmfE/

于 2012-09-07T00:41:36.293 に答える