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

Splitting an array at only certain places but not others

本文关键字:位置 拆分 其他 数组      更新时间:2023-09-26

我非常了解.split()函数。但我似乎能弄清楚的是,如何在某些地方分裂,而不是在其他地方分裂。听起来很困惑?例如,我的意思是,假设我在以下字符串上使用.split(",")

div:(li,div),div

有没有可能把它分开,这样只有括号两边的逗号才能分开。

所以上面用split方法的string应该返回:

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

当然,目前它也在拆分括号内的第一个逗号,返回:

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

有没有办法让这件事像我想要的那样成功?

如果期望的字符串不会变得比这更复杂,那么就不必担心编写代码来解析它们。Regex会很好用的。

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

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

此函数将拆分您在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;
}