2

.split()機能はよくわかります。しかし、私が理解できるように見えるのは、特定の場所では分割するが、他の場所では分割しない方法です。紛らわしいですか?たとえば、.split(",")次の文字列で使用するとします。

div:(li,div),div

括弧の外側のコンマだけが分割されるように分割することは可能ですか?

したがって、string上記のsplitメソッドを使用すると、次のようになります。

['div:(li,div)', 'div']

もちろん、現時点では、括弧内の最初のコンマも分割されており、次のようになります。

['div:(li', 'div)', 'div']

私が望むようにこれを機能させる方法はありますか?

4

3 に答える 3

2

予想される文字列がこれよりも複雑にならない場合は、それらを解析するためのコードの記述について心配する必要はありません。正規表現は問題なく動作します。

http://jsfiddle.net/dC5HN/1/

var str = "div:(li,div),div:(li,div),div";
var parts = str.split(/,(?=(?:[^\)]|\([^\)]*\))*$)/g);
console.log(parts);

出力:

["div:(li,div)", "div:(li,div)", "div"] 
于 2012-08-23T21:52:12.210 に答える
1

REGEXは、本質的に解析しているこの種のもののために構築されていません。

以前にこのような状況に直面したとき、私は最初に括弧で囲まれたパーツを一時的にプレースホルダーに置き換え、次に分割してから、プレースホルダーを元の括弧で囲まれたパーツに置き換えました。

少しハッキーですが、機能します:

    var str = 'div:(li,div),div',
        repls = [];

    //first strip out parenthesised parts and store in array
    str = str.replace(/\([^\)]*\)/g, function($0) {
        repls.push($0);
        return '*repl'+(repls.length - 1)+'*';
    });

    //with the parenthisised parts removed, split the string then iteratively
    //reinstate the removed parenthisised parts
    var pieces = str.split(',').map(function(val, index) {
        return val.replace(/\*repl(\d+)\*/, function($0, $1) {
            return repls[$1];
        });
    });

    //test
    console.log(pieces); //["div:(li,div)","div"]
于 2012-08-23T21:43:44.383 に答える
0

この関数は、splitCharで指定したものをすべて分割しますが、括弧内の場合はその値を無視します。

function customSplit(stringToSplit, splitChar){
    var arr = new Array();
    var isParenOpen = 0
    var curChar;
    var curString = "";

    for (var i = 0; i < stringToSplit.length; i++) {
        curChar = stringToSplit.substr(i, 1);
        switch(curChar) {
            case "(":
                isParenOpen++;
                break;

            case ")":
                if(isParenOpen > 0) isParenOpen--;
                break;
            case splitChar:
                if (isParenOpen < 1) {
                    arr.push(curString);
                    curString = "";
                    continue;
                }
        }

        curString += curChar;
    }
    if (curString.length > 0) {
        arr.push(curString);
    }

    return arr;
}
于 2012-08-23T21:48:14.200 に答える