仅在某些位置拆分数组而不在其他位置拆分数组

时间:2012-08-23 21:26:38

标签: javascript split

我非常了解.split()功能。但我可以想象的是如何在某些地方分裂而在其他地方不分裂。听起来很混乱?嗯,我的意思是,例如,假设我在以下字符串上使用.split(",")

div:(li,div),div

是否可以拆分它,以便只有括号的逗号分开。

因此,使用string方法的split应返回:

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

当然,目前它还将括号中的第一个逗号分开,返回:

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

有没有办法让这项工作像我想要的那样?

3 个答案:

答案 0 :(得分: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"] 

答案 1 :(得分:1)

REGEX不是为这类事物而构建的,它基本上是解析。

在遇到此类情况之前,我首先暂时用占位符替换带括号的部分,然后拆分,然后用原始的parenthised部分替换占位符。

有点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"]

答案 2 :(得分: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;
}