使用多个嵌套分隔符分割字符串

问题描述 投票:0回答:3

我对这个字符串有疑问:

{1 (Test)}{2 ({3 (A)}{4 (B)}{5 (C)})}{100 (AAA{101 (X){102 (Y)}{103 (Z)})}

我想使用

{
作为第一个分隔符,使用
}
作为最后一个分隔符来分割它,但正如你所看到的,我有嵌套的括号。

我怎样才能分割这个字符串以获得这样的东西:

1 (Test)
2 ({3 (A)}{4 (B)}{5 (C)})
100 (AAA{101 (X){102 (Y)}{103 (Z)})

之后我需要再次将其拆分为嵌套括号。

javascript regex string split slice
3个回答
2
投票

您可以使用

/([\{\}])/
正则表达式分割字符串并扫描结果数组以提取标记和深度级别。

var string = "{1 (Test)}{2 ({3 (A)}{4 (B)}{5 (C)})}{100 (AAA{101 (X){102 (Y)}{103 (Z)})}";
var tokens = string.split(/([\{\}])/),
  result = [],
  depth = 0;

tokens.forEach(function scan(token) {
  if (!token) return;
  if (token === "{") {
    depth++;
    return;
  }
  if (token === "}") {
    depth--;
    return;
  }
  result.push({
    depth: depth,
    token: token
  });

});
console.dir(result);


0
投票

使用下面的代码

var a = '{1 (Test)}{2 ({3 (A)}{4 (B)}{5 (C)})}{100 (AAA{101 (X){102 (Y)}{103 (Z)})}';
b = a.replace(/\{/g,'');
c = b.replace(/\}/g,'\n')
console.log(c);

//Results

1 (Test)
2 (3 (A)
4 (B)
5 (C)
100 (AAA101 (X)
102 (Y)
103 (Z))

0
投票

也可以使用下面的代码将其分解为多维数组;

let logic = '(another((checker)check)john)(smith)(jane(does(smith(kline))))';

function getLevel(text) {
  if (Array.isArray(text)) return text.map(t => getLevel(t));
  var d = null,
    str_split = text.split(/([\(\)])/).filter(t => t.trim()),
    result = [],
    tr = '',
    depth = 0,
    groups = [];
  if (str_split.length <= 1) return text;
  for (let i = 0; i < str_split.length; i++) {
    tr = str_split[i];
    //console.log(tr);
    if (tr === '(') {
      if (d === null) {
        if (result.length) groups.push(result.join(''));
        d = depth;
        result = [];
      }
      depth++;
    }
    if (tr === ')') {
      depth--;
    }

    result.push(tr);
    if (d !== null && d === depth && tr === ')') {
      let fr = result.join('');
      if (fr === text && RegExp('^\\(').test(fr) && RegExp('\\)$').test(fr)) {
        let ntext = text.replace(/(^\(|\)$)/g, '');
        fr = getLevel(ntext);
      }
      groups.push(fr);
      d = null;
      result = [];
    }
  }
  if (result.length) groups.push(result.join(''));
  return groups.map(g => getLevel(g));
}

let gr = getLevel(logic);
console.log(JSON.stringify(gr));

//Expected output: [[["another",[[["checker"],"check"]],"john"]],["smith"],[["jane",[["does",[["smith",["kline"]]]]]]]]

© www.soinside.com 2019 - 2024. All rights reserved.