这是我之前问题的直接后续,我得到了以下正则表达式;
const matches = text.match(/(?:\([^()]*(?:\([^()]*\)[^()]*)*\)|[^,])+/g);
Run Code Online (Sandbox Code Playgroud)
由此a,(b, b),c (aaa, (bbb, cccc, ddd)),d我得到
a
(b, b)
c (aaa, (bbb, cccc, ddd))
d
Run Code Online (Sandbox Code Playgroud)
但当我遇到以下情况时,它会失败a,(b, b),c (aaa, ((b b), cccc, ddd)),d,其中有 3 个嵌套括号,在剖析正则表达式如何工作后这是合乎逻辑的。
我尝试更新它以考虑另一级括号,我做了以下操作
a
(b, b)
c (aaa, (bbb, cccc, ddd))
d
Run Code Online (Sandbox Code Playgroud)
它有效(在线演示),但我不确定这是否是最佳解决方案。我也不知道它是否会涵盖所有情况。有人能证实吗?或者也许有更好的正则表达式。
我也在寻找一种方法来为给定数量的括号生成此类正则表达式。我有 2 和 3,但是 N 呢?如果我总是递归地重复以下部分,它会起作用吗(?:\([^()]*\)[^()]*)*?我知道正则表达式无法处理任意数量的嵌套括号,但我并不是在寻找这个。我想要一个给定的数字来生成正则表达式(使用 JS)并使用它。
大多数时候,当您需要跟踪嵌套深度时,单个正则表达式并不是正确的工具。对于这些情况,您可能需要使用编程语言来解析字符串。
对于这种情况,一个简单的解析器可能如下所示:
function parseArgString(string) {
const args = [];
let argStartIndex = 0;
let depth = 0;
for (let index = 0; index < string.length; ++index) {
const char = string[index];
if (char == "(") depth += 1;
if (char == ")") depth -= 1;
if (depth < 0) throw new Error('unexpected ")" character');
if (char == "," && !depth) {
args.push(string.slice(argStartIndex, index).trim());
argStartIndex = index + 1;
}
}
const finalArg = string.slice(argStartIndex).trim();
if (finalArg.length) args.push(finalArg);
return args;
}
const argString = "a,(b, b),c (aaa, ((b b), cccc, ddd)),d";
console.log(parseArgString(argString));Run Code Online (Sandbox Code Playgroud)