.net NET的替代正则表达式引擎,支持递归

.net NET的替代正则表达式引擎,支持递归,.net,regex,recursion,.net,Regex,Recursion,我遇到了一个解析问题,需要一个非常小的正则表达式来解决,除了模式要工作,它应该是递归的。 例如: 我希望它匹配的是一个特定的RTF头,但要做到这一点,我需要它是递归的 {\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Tahoma;}} 是否有一种类似于.NET的非真正正则表达式的引擎实现,允许查找与这些类型模式的匹配项(甚至可能是不同的语法) 更新: 我非常感谢大家告诉我正则表达式在.NET实现中的选项

我遇到了一个解析问题,需要一个非常小的正则表达式来解决,除了模式要工作,它应该是递归的。
例如:

我希望它匹配的是一个特定的RTF头,但要做到这一点,我需要它是递归的

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
是否有一种类似于.NET的非真正正则表达式的引擎实现,允许查找与这些类型模式的匹配项(甚至可能是不同的语法)

更新:

我非常感谢大家告诉我正则表达式在.NET实现中的选项,特别是在下面的评论中提供了一个非常全面的链接,这帮助我理解了这一切,也为我的具体示例提供了答案。如果你正在阅读这篇文章,并且它也对你有所帮助,请务必对这个答案进行投票。
然而…这并没有回答关于类.NET正则表达式引擎中递归可能性的一般问题。幸运的是,这个例子(我喜欢挑战)不是我遇到的唯一一个。使用此解决方案无法解决其他情况,但只能通过不引用匹配项,而是重用一个模式序列,从而达到可以进行递归的程度。

对于您的示例,使用

您可以使用如下表达式:

{
[^{}]*
(?:({)[^{}]*)*
(?'-1'})*
(?(1)(?!))
}
例如:

string re = @"{[^{}]*(?:({)[^{}]*)*(?'-1'})*(?(1)(?!))}";
string str = "foo {bar} baz {foo{bar{baz}}} {f{o{o}}{bar}baz} {foo{bar}baz}";

Console.WriteLine("Input: \"{0}\"", str);
foreach (Match m in Regex.Matches(str, re))
{
    Console.WriteLine("Match: \"{0}\"", m);
}
输出:

Input: "foo {bar} baz {foo{bar{baz}}} {f{o{o}}{bar}baz} {foo{bar}baz}"
Match: "{bar}"
Match: "{foo{bar{baz}}}"
Match: "{o{o}}"
Match: "{bar}"
Match: "{bar}"

即使Qtax示例非常好且清晰,但它对我来说也不完全匹配,因为返回
{o{o}}
而不是
{f{o{o}}}{bar}{baz}

找了一段时间后,我的解决方案是(使用几乎相同的示例):

输入:

string re = @"{(((?<Counter>{)*[^{}]*)*((?<-Counter>})*[^{}]*)*)*(?(Counter)(?!))}";
string str = "foo {bar} baz {foo{bar{{baz}a{a{b}}}}} {f{o{o}}{bar{a{b{c}}{d}}}baz} {foo{bar}baz}";

Console.WriteLine("Input: \"{0}\"", str);
foreach (Match m in Regex.Matches(str, re))
{
    Console.WriteLine("Match: \"{0}\"", m);
}
解释一下,我为每个
{
递增一个计数器,并在每个
}
递减计数器。最后,正则表达式仅在计数器为空时匹配(
(?(计数器)(?!)

它似乎适用于深层递归,也适用于备用括号

看看这个,它也帮助我创建了这个正则表达式

我希望这会有所帮助

附言: 如果还希望在末尾将字符串与遗忘的}匹配,请使用:

string re = @"{(((?<Counter>{)*[^{}]*)*((?<-Counter>(}|$))*[^{}]*)*)*(?(Counter)(?!))(}|$)";
string str = "foo {bar} baz {foo{bar{{baz}a{a{b}}}}} {f{o{o}}{bar{a{b{c}}{d}}}baz} {foo{bar}b{az";
string re=@“{((((?{)*[^{}]*)*(((((}}}$)*[^{}]*)*)*((((?(}}])((?!)(}}}}}$)”;
string str=“foo{bar}baz{foo{bar{baz}a{a{b}}}{f{o{o}}{bar{a{b{c}}{d}}baz}{foo{b}}b{az”;

虽然不是递归的直接答案,.NET对的支持可能对这个问题很有用。手册中的平衡组:是的,我确实觉得这很有帮助,谢谢。但是,这不是我需要递归正则表达式的唯一情况。不是这个特定问题的完整答案,而是最接近的答案,它确实有帮助。谢谢。
Input: "foo {bar} baz {foo{bar{{baz}a{a{b}}}}} {f{o{o}}{bar{a{b{c}}{d}}}baz} {foo{bar}baz}"
Match: "{bar}"
Match: "{foo{bar{{baz}a{a{b}}}}}"
Match: "{f{o{o}}{bar{a{b{c}}{d}}}baz}"
Match: "{foo{bar}baz}"
string re = @"{(((?<Counter>{)*[^{}]*)*((?<-Counter>(}|$))*[^{}]*)*)*(?(Counter)(?!))(}|$)";
string str = "foo {bar} baz {foo{bar{{baz}a{a{b}}}}} {f{o{o}}{bar{a{b{c}}{d}}}baz} {foo{bar}b{az";