为了删除括号之间的所有内容,目前我使用:
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)
结束。