忽略正则表达式匹配的 N 个嵌套括号内的逗号

Tem*_*fif 5 javascript regex

这是我之前问题的直接后续,我得到了以下正则表达式;

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)并使用它。

3li*_*t0r 4

大多数时候,当您需要跟踪嵌套深度时,单个正则表达式并不是正确的工具。对于这些情况,您可能需要使用编程语言来解析字符串。

对于这种情况,一个简单的解析器可能如下所示:

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)