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

本文关键字:文本 圆括号 嵌套 正则表达式 用于 | 更新日期: 2023-09-27 17:59:44

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

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或

但是,当我的输入有多个嵌套的圆括号时,它会错误地工作。

对于此输入:

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

我想取结果,但它打印"或与或"

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

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

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

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

如果字符串不能具有转义序列,请使用平衡构造

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

这里的要点是,表达式不应包含任何锚(如什么是正则表达式平衡组)。

详细信息

  • '(-文字(
  • (?>-启动原子组以防止回溯到其中
    • [^()]-除()之外的任何字符
    • |-或
    • (?<o>)'(-匹配文字(并将空值推入堆栈"o"
    • |-或
    • (?<-o>)')-匹配文字)并从堆栈"o"中删除一个值
  • )*-匹配原子组的零次或多次出现
  • ')-文字)
  • (?(o)(?!))-如果堆栈"o"包含值(不为空),则条件构造匹配失败

请参阅regex演示。

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#演示