使用GREL从字符串中删除最外面的括号时遇到问题。我想做的就是简单地删除最外面的括号,所有其他括号应保持完整。以下是我要使用正则表达式尝试做的事情-
value.split(/(abc+/)
和下面是我要解析的示例字符串以及所需的输出。
Foo ( test1 test2 ) => Foo test1 test2
Bar ( test1 t3() test2 ) => Bar test1 t3() test2
Baz ((("Fdsfds"))) => Baz (("Fdsfds"))
我将不胜感激。
答案 0 :(得分:3)
一个选项可能是使用捕获组,而在替换中使用第一个捕获组。
请注意,这没有考虑到括号之间的问题。
它与外部括号匹配,然后将组内的内容捕获并再次与外部括号匹配。
捕获组内部是一个与()
不匹配的匹配项,或者是一个从开始到结束的不匹配括号。
\((\(*(?:[^)(]*|\([^)]*\))*\)*)\)
说明
\(
匹配外部括号(
(
捕获组
-\(*
匹配0次以上(
(?:
非捕获组
[^)(]*
匹配0+次,而不是(
或)
|
或\([^)]*\)
从(
匹配到下一个)
右括号)*
关闭非捕获组并重复0次以上\)*
匹配0+次右括号)
关闭捕获组\)
匹配外部右括号答案 1 :(得分:2)
我对grel
或openrefine
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
。
jex.im可视化正则表达式:
答案 3 :(得分:1)
使用GREL可以有多种方法。如果要使用正则表达式,则建议在GREL中将其与GREL match
函数结合使用:
value.match(/(.*?)\((.*)\)(.*)/).join("")
请注意,此表达式假定单元格中至少有一对括号-没有括号或只有一个开括号或仅一个闭括号的单元格将产生错误-但是您可以使用选项'on error keep原始”(默认),在这种情况下进行单元格转换以保持原始值