1

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

value.split(/(abc+/)

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

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

我将不胜感激任何帮助。

4

4 回答 4

3

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

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

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

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

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

解释

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

正则表达式演示

于 2019-06-10T08:12:57.120 回答
2

我完全不熟悉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
于 2019-06-10T04:01:08.737 回答
2

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

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

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

于 2019-06-10T08:52:46.730 回答
1

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

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

我们会用$1 $3.

演示

正则表达式电路

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

在此处输入图像描述

于 2019-06-10T02:58:36.120 回答