删除嵌套圆括号之间的所有内容



为了删除括号之间的所有内容,目前我使用:

SELECT 
REGEXP_REPLACE('(aaa) bbb (ccc (ddd) / eee)', "\([^()]*\)", "");

这是不正确的,因为它给出了bbb (ccc / eee),因为它只删除了内部括号。

如何删除嵌套圆括号之间的所有内容?所以这个例子的预期结果是bbb

在Google BigQuery的情况下,只有当您知道嵌套的最大数量时,这才有可能。因为它使用的re2库不支持regex递归。

let r = /((?:(?:((?:[^()])*))|(?:[^()]))*)/g
let s = "(aaa) bbb (ccc (ddd) / eee)"
console.log(s.replace(r, ""))

如果您可以对正则表达式操作进行迭代,直到达到固定点,您可以这样做:

repeat {
old_string = string
string := remove_non_nested_parens_using_regex(string)
} until (string == old_string)

例如,如果我们有

((a(b)) (c))x)

在第一次迭代中,我们删除了(b)(c):以(开始、以)结束且不包含括号的序列,由([^()]*)匹配。我们最终得到:

((a) )x)

然后在下一次迭代中,(a)消失了:

( )x)

在一次迭代之后,( )消失了:

x)

当我们尝试删除更多的括号时,没有更多的变化,因此算法以x)结束。

最新更新