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 不是为这种事情而构建的,它本质上是解析。

以前遇到这种情况时,我首先将括号部分暂时替换为占位符,然后拆分,然后将占位符替换为原始括号部分。

有点hacky,但它有效:

    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 回答