如何识别字符串中的对

时间:2016-09-28 01:51:39

标签: javascript

假设我有字符串:"((a,(b,c)),(d,(e,(f,g))))"

如何分别提取每对,例如拆分第一对并提取(a,(b,c))(d,(e,(f,g)))

我对如何处理这个问题感到很遗憾。由于对可以变化,因为我不能精确地寻找设定模式。

我认为对此的一种方法是确定","在最外面的括号中的位置。比如在( (set of pairs 1) , (set of pairs 2))找到它。 所以我可以把剩下的一切都拿走了。但我不知道该怎么做。使用str.Indexof()将首次出现",",而不是我感兴趣的那个。

2 个答案:

答案 0 :(得分:0)

我会遍历字符串的字符,跟踪括号的嵌套方式,找到第一个没有嵌套的逗号,然后(如你所说)将部分放在左边和右边:

function getPairs(input) {
  // remove outer parentheses, if present
  if (input[0] === "(")
    input = input.slice(1,-1);
  // find first comma that isn't inside parentheses
  var parenNestLevel = 0;
  for (var i = 0; i < input.length; i++) {
    if (parenNestLevel === 0 && input[i] === ",")
      return [input.slice(0, i), input.slice(i+1)];
    else if (input[i] === "(")
      parenNestLevel++;
    else if (input[i] === ")")
      parenNestLevel--;
  }
  // note: returns undefined if the input couldn't be parsed
}

var input = "((a,(b,c)),(d,(e,(f,g))))";
var pairs = getPairs(input);
console.log(pairs);
console.log(getPairs(pairs[0]));

对于你的输入,那将返回数组["(a,(b,c))", "(d,(e,(f,g)))"],然后你可以在返回的数组的部分运行getPairs(),或者使它递归,或者其他什么 - 你真的没有它清楚最终输出应该来自您的样本"((a,(b,c)),(d,(e,(f,g))))"输入。

答案 1 :(得分:0)

这是一个更简单的解决方案。我们首先删除第一个和最后一个括号,然后将结果字符串拆分为'),(',然后迭代结果并根据它们的位置将缺少的括号添加/追加到各个元素:

var a = "((a,(b,c)),(d,(e,(f,g))))";
var b = a.substring(1,a.length-1); //remove first and last parenthesis
var c = b.split('),('); //get pairs
for(var i=0;i<c.length;i++){
  if(i%2===0){
    c[i] = c[i]+')';
  }else{
    c[i] = '('+c[i];
  }
}
console.log(c); // ["(a,(b,c))", "(d,(e,(f,g)))"]