用于匹配嵌套括号内的特定文本的 C# 正则表达式
Posted
技术标签:
【中文标题】用于匹配嵌套括号内的特定文本的 C# 正则表达式【英文标题】:C# regex for matching sepcific text inside nested parentheses 【发布时间】:2021-01-15 04:44:13 【问题描述】:我有这些代码行用于括号之间的运算符:
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。
虽然字符串中有两个(
字符,但是当匹配到第一个)
字符后结束处理。
如何调整我的正则表达式模式?
【问题讨论】:
您不应该对层次结构使用正则表达式(代码;XML 等) 另见***.com/questions/19596502/regex-nested-parentheses。 用来结束这个问题的那个不是完全重复的,尽管它确实解释了这个概念并提供了一个几乎精确的解决方案。 【参考方案1】:您的 \(.*?\)
正则表达式包含 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
【讨论】:
如果您想删除问题,请告诉我,我将删除我的答案。 我想留下来回答这个问题。因为,我是 c# 的初学者,尽管研究了这个主题,但我无法解决这个问题。您的回答可以帮助像我这样的其他人。再次感谢.. 很抱歉接受过程。我对这个平台了解不够。我希望它现在成功 是的,现在很好。我还添加了一个人类可读的模式描述。 我看到了。感谢您的帮助。以上是关于用于匹配嵌套括号内的特定文本的 C# 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章