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
我想取结果或,但它打印"或与或"。
虽然字符串中有两个(
字符,但当它在匹配第一个)
字符后结束处理时。
如何调整正则表达式模式?
您的'(.*?')
正则表达式包含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#演示