用于匹配嵌套括号内的特定文本的 C# 正则表达式

Posted

技术标签:

【中文标题】用于匹配嵌套括号内的特定文本的 C# 正则表达式【英文标题】:C# regex for matching sepcific text inside nested parentheses 【发布时间】:2021-01-15 04:44:13 【问题描述】:

我有这些代码行用于括号之间的运算符:

string filtered = Regex.Replace(input, "\\(.*?\\)", string.Empty);
var result = filtered.Split(new[]  ' ' , 
            StringSplitOptions.RemoveEmptyEntries)
            .Where(element => element == "OR" || element == "AND");    
string temp = string.Join(" ", result);

这些行不适用于嵌套括号。

例如;它适用于这个输入

X1 OR ( X2 AND X3 AND X4 AND X5 ) OR X6

它给了我这个结果:OR OR

但是,当我的输入有多个嵌套括号时,它就会出错。

对于这个输入:

X1 OR ( X2 AND( X3 AND X4 ) AND X5 ) OR X6

我想获取结果 OR OR,但它会打印 OR AND OR

虽然字符串中有两个(字符,但是当匹配到第一个)字符后结束处理。

如何调整我的正则表达式模式?

【问题讨论】:

您不应该对层次结构使用正则表达式(代码;XML 等) 另见***.com/questions/19596502/regex-nested-parentheses。 用来结束这个问题的那个不是完全重复的,尽管它确实解释了这个概念并提供了一个几乎精确的解决方案。 【参考方案1】:

您的 \(.*?\) 正则表达式包含 3 个部分:1) \( 匹配文字 (,2) .*? lazy 点匹配模式(匹配 0+ 以外的任何字符换行符,尽可能少,直到 first ),以及 3) 匹配文字 )\)

使用balancing construct 如果您的字符串不能有转义序列

@"\((?>[^()]|(?<o>)\(|(?<-o>)\))*\)(?(o)(?!))"

这里的重点是,表达式不应包含任何锚点(如What are regular expression Balancing Groups)。

详情

\( - 文字 ( (?&gt; - 原子组的开始,以防止回溯到它 [^()] - 除() 之外的任何字符 | - 或 (?&lt;o&gt;)\( - 匹配文字 ( 并将一个空值推入堆栈“o” | - 或 (?&lt;-o&gt;)\) - 匹配文字 ) 并从堆栈“o”中删除一个值 )* - 匹配零个或多个原子组 \) - 文字 ) (?(o)(?!)) - 如果堆栈“o”包含值(非空),则条件构造失败。

请参阅regex demo。

var input = "X1 OR ( X2 AND( X3 AND X4 ) AND X5 ) OR X6";
var filtered = Regex.Replace(input, @"\((?>[^()]|(?<o>)\(|(?<-o>)\))*\)(?(o)(?!))", string.Empty);
var result = filtered.Split(new[]  ' ' , 
    StringSplitOptions.RemoveEmptyEntries)
    .Where(element => element == "OR" || element == "AND");    
var temp = string.Join(" ", result);

见C# demo

【讨论】:

如果您想删除问题,请告诉我,我将删除我的答案。 我想留下来回答这个问题。因为,我是 c# 的初学者,尽管研究了这个主题,但我无法解决这个问题。您的回答可以帮助像我这样的其他人。再次感谢.. 很抱歉接受过程。我对这个平台了解不够。我希望它现在成功 是的,现在很好。我还添加了一个人类可读的模式描述。 我看到了。感谢您的帮助。

以上是关于用于匹配嵌套括号内的特定文本的 C# 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于捕获嵌套括号中的值的正则表达式

C# 正则表达式 - 为括号内的单个模式查找一个或多个匹配项

js 正则表达式获取小括号内的内容,不含括号

用于匹配大括号中的每一行的正则表达式

正则表达式()()12的用法

怎么用正则表达式匹配中括号内的字符