正则表达式模式忽略输入字符串中的内括号
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 text1、any text2、any text3 和 any 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(
文字
(?>
- 原子组的开始:
"[^"\\]*(?:\\.[^"\\]*)*"
- 一个 "..."
字符串,可能包含转义的 "
字符
|
- 或
[^()]
- 除了(
和)
之外的任何一个字符
|
- 或
(?<c>)\(
- (
char 匹配,并将一个空值推送到 Group c
堆栈
|
- 或
(?<-c>)\)
- )
匹配字符并从组中弹出一个空值 c
堆栈
)*
- 原子组结束,重复零次或多次
(?(c)(?!))
- 条件构造:如果 Group c
堆栈不为空失败,则触发回溯
\)
- )
字符。
【讨论】:
以上是关于正则表达式模式忽略输入字符串中的内括号的主要内容,如果未能解决你的问题,请参考以下文章