删除最外面的括号

Remove outermost parentheses

我在使用 GREL 从字符串中删除最外面的括号时遇到问题。我想做的只是删除最外面的括号,所有其他括号都应保持不变。以下是我正在尝试使用正则表达式 -

value.split(/(abc+/)

以下是我尝试解析的示例字符串和所需的输出。

Foo ( test1 test2 ) => Foo test1 test2
Bar ( test1 t3() test2 ) => Bar test1 t3() test2
Baz ((("Fdsfds"))) => Baz (("Fdsfds"))

如有任何帮助,我将不胜感激。

如果我们的输入都与问题中列出的输入相似,则此表达式可能有效:

(.+?)\s+\((\s+)?(.*)(\s+)?\)

我们会用 替换它。

Demo

正则表达式电路

jex.im 可视化正则表达式:

我完全不熟悉 grelopenrefine 正则表达式语法或限制,在更广泛的上下文中,您可以使用以下正则表达式之一,具体取决于所使用的正则表达式引擎。

PCRE 正则表达式:

^[^(]*\K\(|\)(?!.*\).*)

演示:https://regex101.com/r/lj0Qbl/1/

ECMA 正则表达式:

(?<!.*\(.*)\(|\)(?!.*\).*)

演示:https://regex101.com/r/g8XbjI/1/

对于两者:

输入:

Foo ( test1 test2 ) bob
Bar ( test1 t3() test2 ) bob
Baz ((("Fdsfds"))) bob

输出:

Foo  test1 test2  bob
Bar  test1 t3() test2  bob
Baz (("Fdsfds")) bob

一个选项可能是使用捕获组,并在替换中使用第一个捕获组。

请注意,这没有考虑平衡括号。

它匹配外括号,然后在一组中捕获里面的内容并再次匹配外括号。

捕获组内有一个不匹配 () 或从括号到右括号的交替。

\((\(*(?:[^)(]*|\([^)]*\))*\)*)\)

说明

  • \(匹配外括号(
  • ( 捕获组 -\(* 匹配 0+ 次 (
    • (?:非捕获组
      • [^)(]* 匹配 0+ 次而不是 ()
      • |
      • \([^)]*\) 匹配从 ( 到下一个 ) 右括号
    • )*关闭非捕获组并重复0+次
    • \)* 匹配 0+ 次右括号
  • ) 关闭捕获组
  • \) 匹配外右括号

Regex demo

使用 GREL 有多种方法可以做到这一点。如果您想在 GREL 中使用正则表达式,我建议将其与 GREL match 函数结合使用:

value.match(/(.*?)\((.*)\)(.*)/).join("")

请注意,此表达式假定单元格中至少有一对括号 - 没有括号或只有左括号或右括号的单元格会出错 - 但是您可以使用选项 'on error keep original'(这是默认值)在这些情况下进行单元格转换以保持原始值