如何在忽略括号中的部分时拆分​​字符串?

时间:2016-09-22 19:38:48

标签: javascript

我有一个字符串,我希望通过使用逗号作为分隔符将其拆分为数组。我不希望括号内的字符串部分被拆分,即使它们包含逗号。

例如:

"bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla" 

应该成为:

["bibendum", "morbi", "non", "quam (nec, dui, luctus)", "rutrum", "nulla"]

但是当我使用基本的.split(",")时,它会返回:

["bibendum", " morbi", " non", " quam (nec", " dui", " luctus)", " rutrum", " nulla"]

我需要它返回:

["bibendum", " morbi", " non", " quam (nec, dui, luctus)", " rutrum", " nulla"]

感谢您的帮助。

5 个答案:

答案 0 :(得分:6)

s="bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla" 
var current='';
var parenthesis=0;
for(var i=0, l=s.length; i<l; i++){ 
  if(s[i] == '('){ 
    parenthesis++; 
    current=current+'(';
  }else if(s[i]==')' && parenthesis > 0){ 
    parenthesis--;
    current=current+')';
  }else if(s[i] ===',' && parenthesis == 0){
    console.log(current);current=''
  }else{
    current=current+s[i];
  }   
}
if(current !== ''){
  console.log(current);
}

你走了。正则表达式的解释:

var regex = /,(?![^(]*\)) /;
var str = "bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla"; 

var splitString = str.split(regex);

答案 1 :(得分:3)

你不需要花哨的正则表达式。

_itemSelected : function(e) {
    var selectedItem = e.target.selectedItem;
    if (selectedItem) {
        console.log("selected: " + selectedItem.value);
    }
}

更改console.log以获得数组连接或任何您想要的内容。

答案 2 :(得分:2)

而不是专注于你所做的不想,通常更容易表达你想要的正则表达式,以及match全局表达式正则表达式:

var str = "bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla";
str.match(/[^,]+(?:\(+*?\))?/g) // the simple one
str.match(/[^,\s]+(?:\s+\([^)]*\))?/g) // not matching whitespaces

答案 3 :(得分:0)

var start = "bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla";
start = start.replace(/ /g,'');
console.log(start);

var front = start.substring(0,start.lastIndexOf('(')).split(',');
var middle = '('+start.substring(start.lastIndexOf('(')+1,start.lastIndexOf(')'))+')';
var end = start.substring(start.lastIndexOf(')')+2,start.length).split(',');
console.log(front)
console.log(middle)
console.log(end)
return front.concat(middle,end);

答案 4 :(得分:0)

我不喜欢代码中包含大的不透明正则表达式,因此我使用了不同的解决方案。它仍然使用正则表达式,但我认为它更加透明。

我使用一个更简单的正则表达式将括号内的任何逗号替换为特殊字符串。然后,我用逗号分割字符串,然后在每个结果标记中用逗号替换特殊字符串。

    splitIgnoreParens(str: string): string[]{
    const SPECIAL_STRING = '$REPLACE_ME';

    // Replaces a comma with the special string
    const replaceComma = s => s.replace(',',SPECIAL_STRING);
    // Vice versa
    const replaceSpecialString = s => s.replace(SPECIAL_STRING,',');

    // Selects any text within parenthesis
    const parenthesisRegex = /\(.*\)/gi;

    // Withing all parenthesis, replace comma with special string.
    const cleanStr = str.replace(parenthesisRegex, replaceComma);
    const tokens = cleanStr.split(',');
    const cleanTokens = tokens.map(replaceSpecialString);

    return cleanTokens;
}