Javascript 仅在某些位置拆分数组,而不在其他位置拆分数组
我非常理解Javascript 仅在某些位置拆分数组,而不在其他位置拆分数组,javascript,split,Javascript,Split,我非常理解.split()函数。但我似乎能弄明白的是如何在某些地方分裂,而不是在其他地方。听起来很困惑?我的意思是,例如,假设我在以下字符串上使用.split(“,”: div:(li,div),div 是否可以拆分它,以便只拆分括号外的逗号 因此,上面带有split方法的字符串应返回: ['div:(li,div)', 'div'] 当然,现在它也在分割括号内的第一个逗号,返回: ['div:(li', 'div)', 'div'] 有什么方法可以让它像我所希望的那样工作吗?REGEX不
.split()
函数。但我似乎能弄明白的是如何在某些地方分裂,而不是在其他地方。听起来很困惑?我的意思是,例如,假设我在以下字符串上使用.split(“,”
:
div:(li,div),div
是否可以拆分它,以便只拆分括号外的逗号
因此,上面带有split
方法的字符串应返回:
['div:(li,div)', '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;
}
函数customSplit(stringToSplit,splitChar){
var arr=新数组();
var isParenOpen=0
var-curChar;
var curString=“”;
对于(var i=0;i0)isParenOpen--;
打破
案例拆分字符:
如果(isParenOpen<1){
arr.push(光标);
curString=“”;
继续;
}
}
curString+=curChar;
}
如果(curString.length>0){
arr.push(光标);
}
返回arr;
}
如果您期望的字符串不会变得比这更复杂,那么您不必担心编写代码来解析它们。正则表达式可以很好地工作
产出:
["div:(li,div)", "div:(li,div)", "div"]
一般来说,在某些语法中,括号约定的存在意味着解释句子将需要一个比正则表达式机制更健壮的解析器。这是否可能在JavaScript中实现?这是否可行<代码>/,(?!.\)/
解析,smarsing。我的答案很好。谢谢大家的帮助。你能帮我解决一个问题吗。假设您能够根据需要使用多达div:(li,div)
(例如)。但是div:(li,div),div:(li,div),div
(例如)不起作用。有修复方法吗?啊-我在第一个replace
模式中错过了全局修饰符。请参见编辑(请注意正斜杠后面的g
)。谢谢,这非常有用。关于此方法的注意事项,括号内是括号。不确定这是否与您的场景有关。“div:((li),div),div:(li,div)”代表instance@LondonDrugs_MediaServices我的答案将分成两部分:“div:(div:(li,li,li),div),(li,div,a),div,div:(div,div,a)”
,(“div:(div:(li,li,li),div)”,“div:(li,div,a)”,“div”,“div:(div,div,li,div,a)”,
谢谢你的回答和我想的一样,有点长。但它现在可以用了。我相信它可以优化/缩小,但我希望它可读,这样你就知道发生了什么。
["div:(li,div)", "div:(li,div)", "div"]