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

C# regex for matching sepcific text inside nested parentheses

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

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);

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

例如;它正在为此 input 工作:

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.

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

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

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

如果您的字符串不能包含转义序列,请使用 balancing construct :

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

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

详情:

  • \( - 文字 (
  • (?> - 原子组的开始以防止回溯到它
    • [^()] - ()
    • 以外的任何字符
    • | - 或
    • (?<o>)\( - 匹配文字 ( 并将空值压入堆栈 "o"
    • | - 或
    • (?<-o>)\) - 匹配文字 ) 并从堆栈中删除一个值 "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