我非常了解.split()
功能。但我可以想象的是如何在某些地方分裂而在其他地方不分裂。听起来很混乱?嗯,我的意思是,例如,假设我在以下字符串上使用.split(",")
:
div:(li,div),div
是否可以拆分它,以便只有括号的逗号分开。
因此,使用string
方法的split
应返回:
['div:(li,div)', 'div']
当然,目前它还将括号中的第一个逗号分开,返回:
['div:(li', 'div)', 'div']
有没有办法让这项工作像我想要的那样?
答案 0 :(得分:2)
如果您期望的字符串不会变得比这更复杂,您不必担心编写代码来解析它们。正则表达式会正常工作。
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;
}