正则表达式模式忽略输入字符串中的内括号

Posted

技术标签:

【中文标题】正则表达式模式忽略输入字符串中的内括号【英文标题】:Regex Pattern to ignore the inner parenthesis in the input string 【发布时间】:2021-08-16 18:22:43 【问题描述】:

我一直在努力寻找满足以下要求的解决方案

输入字符串为 Sum(Spec("any text1" : "any text2"),spec("any text3" : "any text4")) 我想匹配字符串 spec("any text1" : "any text2")spec("any text3" : "any text4"))

我尝试的模式是Spec\(([^)]*)\)

此模式适用于上述输入,但如果任何 any text1any text2any text3any text4 包含括号则匹配失败

ex input Sum(Spec("any text1 with (bracket)" : "any text2"),spec("any text3" : "any text4"))

文本也可以包含引号"chassis \"4\""

【问题讨论】:

\bSpec\((?>[^()]+|(?<c>)\(|(?<-c>)\))*(?(c)(?!))\) 如果()"..." 中存在,则需要更具体的解决方案。但是我们需要更多细节,比如\" 是否可以在"..." 之间。 这对你有用吗? 是的,文本也可能包含引号"chassis \"4\"" 我将“是”理解为“"..." 之间可以有括号”。 【参考方案1】:

你可以使用

(?is)\bSpec\((?>"[^"\\]*(?:\\.[^"\\]*)*"|[^()]|(?<c>)\(|(?<-c>)\))*(?(c)(?!))\)

请参阅.NET regex demo。

详情

(?is) - 不区分大小写的修饰符 \b - 单词边界 Spec\( - Spec( 文字 (?&gt; - 原子组的开始: "[^"\\]*(?:\\.[^"\\]*)*" - 一个 "..." 字符串,可能包含转义的 " 字符 | - 或 [^()] - 除了() 之外的任何一个字符 | - 或 (?&lt;c&gt;)\( - ( char 匹配,并将一个空值推送到 Group c 堆栈 | - 或 (?&lt;-c&gt;)\) - ) 匹配字符并从组中弹出一个空值 c 堆栈 )* - 原子组结束,重复零次或多次 (?(c)(?!)) - 条件构造:如果 Group c 堆栈不为空失败,则触发回溯 \) - ) 字符。

【讨论】:

以上是关于正则表达式模式忽略输入字符串中的内括号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

用于忽略自定义转义字符的正则表达式模式

js-正则表达式

正则表达式模式修饰符

如何忽略正则表达式中的括号[重复]