【问题标题】:Removing everything between nested parentheses删除嵌套括号之间的所有内容
【发布时间】:2022-10-24 00:04:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 正则表达式通常无法匹配嵌套表达式。

标签: regex google-bigquery


【解决方案1】:

对于 Google BigQuery,只有在您知道最大嵌套数的情况下才有可能。因为uses re2 librarydoesn't support regex recursions

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

【讨论】:

  • 谢谢,但我不知道最大嵌套数
  • 在这种情况下,您需要使用正则表达式递归like this,但 Google BigQuery 使用doesn't support recursions 的 re2 库
【解决方案2】:

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

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) 终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多