删除最外面的括号

时间:2019-06-10 02:28:31

标签: regex parentheses openrefine grel

使用GREL从字符串中删除最外面的括号时遇到问题。我想做的就是简单地删除最外面的括号,所有其他括号应保持完整。以下是我要使用正则表达式尝试做的事情-

value.split(/(abc+/)

和下面是我要解析的示例字符串以及所需的输出。

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

我将不胜感激。

4 个答案:

答案 0 :(得分:3)

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

请注意,这没有考虑到括号之间的问题。

它与外部括号匹配,然后将组内的内容捕获并再次与外部括号匹配。

捕获组内部是一个与()不匹配的匹配项,或者是一个从开始到结束的不匹配括号。

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

说明

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

Regex demo

答案 1 :(得分:2)

我对grelopenrefine regex语法或限制完全不熟悉,在更广泛的范围内,根据所使用的regex引擎,您可以使用以下正则表达式之一。

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

答案 2 :(得分:1)

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

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

,我们将其替换为$1 $3

Demo

RegEx电路

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

enter image description here

答案 3 :(得分:1)

使用GREL可以有多种方法。如果要使用正则表达式,则建议在GREL中将其与GREL match函数结合使用:

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

请注意,此表达式假定单元格中至少有一对括号-没有括号或只有一个开括号或仅一个闭括号的单元格将产生错误-但是您可以使用选项'on error keep原始”(默认),在这种情况下进行单元格转换以保持原始值