我将这些代码行用于括号之间的运算符:
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。
尽管(
字符串中有两个字符,但是在匹配第一个)
字符后结束处理。
如何调整我的正则表达式模式?
您的\(.*?\)
正则表达式包含3个部分:1)\(
匹配文字(
,2).*?
惰性点匹配模式(与0+匹配除换行符以外的任何字符,最少匹配到第一个 )
,以及3)\)
匹配文字)
。
如果您的字符串不能转义序列,请使用平衡构造 :
@"\((?>[^()]|(?<o>)\(|(?<-o>)\))*\)(?(o)(?!))"
这里的要点是,表达式不应包含任何锚点(如“什么是正则表达式Balancing Groups”)。
详细资料:
\(
-文字 (
(?>
-开始原子组以防止回溯到原子组中
[^()]
-除(
和以外的任何字符)
|
- 或者(?<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#演示
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句