我对这个字符串有疑问:
{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)})
之后我需要再次将其拆分为嵌套括号。
您可以使用
/([\{\}])/
正则表达式分割字符串并扫描结果数组以提取标记和深度级别。
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);
使用下面的代码
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))
也可以使用下面的代码将其分解为多维数组;
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"]]]]]]]]