gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:47:09 25 4
gpt4 key购买 nike

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

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+ 除换行符以外的任何字符,尽可能少,直到 第一个 ) 和 3)一个 \)匹配文字 ) .

使用balancing construct 如果您的字符串不能有转义序列:

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

这里的要点是表达式不应包含在任何 anchor 中(如 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# 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38713119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com