用于匹配嵌套括号内的特定文本的 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);
我有这些代码行用于括号之间的运算符:
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);