删除最外面的括号
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 可视化正则表达式:
我完全不熟悉 grel
或 openrefine
正则表达式语法或限制,在更广泛的上下文中,您可以使用以下正则表达式之一,具体取决于所使用的正则表达式引擎。
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+ 次右括号
)
关闭捕获组
\)
匹配外右括号
使用 GREL 有多种方法可以做到这一点。如果您想在 GREL 中使用正则表达式,我建议将其与 GREL match
函数结合使用:
value.match(/(.*?)\((.*)\)(.*)/).join("")
请注意,此表达式假定单元格中至少有一对括号 - 没有括号或只有左括号或右括号的单元格会出错 - 但是您可以使用选项 'on error keep original'(这是默认值)在这些情况下进行单元格转换以保持原始值
我在使用 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 可视化正则表达式:
我完全不熟悉 grel
或 openrefine
正则表达式语法或限制,在更广泛的上下文中,您可以使用以下正则表达式之一,具体取决于所使用的正则表达式引擎。
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+ 次右括号
)
关闭捕获组\)
匹配外右括号
使用 GREL 有多种方法可以做到这一点。如果您想在 GREL 中使用正则表达式,我建议将其与 GREL match
函数结合使用:
value.match(/(.*?)\((.*)\)(.*)/).join("")
请注意,此表达式假定单元格中至少有一对括号 - 没有括号或只有左括号或右括号的单元格会出错 - 但是您可以使用选项 'on error keep original'(这是默认值)在这些情况下进行单元格转换以保持原始值