正则表达式,反向引用或替代构造

时间:2009-11-24 20:49:25

标签: .net regex recursive-regex

我正在尝试在.NET中编写一个正则表达式,从一系列看起来像这样的函数中捕获整个函数。

public string Test1()
{
    string result = null;
    foreach(var item in Entity.EntityProperties)
    {
        result +=string.Format("inner string with bracket{0}", "test");
    }
    return result;
}
public string Test5()
{
    return string.Format("inner string with bracket{0}", "test");
}

public string Last()
{
    return string.Format("inner string with bracket{0}", "test");
}

所以我得到了

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*public string))

这将捕获除最后一个函数之外的所有函数......或者

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*(public string)|$))

这将正确匹配除第一个以外的所有功能。第一个函数只是部分匹配。

public string Test1()
{
    string result = null;
    foreach(var item in Entity.EntityProperties)
    {
        result +=string.Format("inner string with bracket{0}", "test");
    } <-- the first capture only get to this point.

有什么想法吗?如果可能,请提供一些解释。

2 个答案:

答案 0 :(得分:1)

虽然我非常喜欢正则表达式,但在你的情况下它们不起作用,因为嵌套结构不是“常规”,因此无法与正则表达式匹配。你需要一个解析器来完成这种工作。遗憾。

答案 1 :(得分:1)

实际上可以在.NET中执行此操作来检查匹配的括号。关键是要使用平衡组。我之前听说过这就是我问这个问题的原因。我只是不确定如何自己编写表达式所以我希望一些常驻的reg专家可以帮助我:)

幸运的是我找到了这个网站。这解释了平衡组的细节......他甚至提供了一个模板。所以这里是其他人的参考。

http://blog.stevenlevithan.com/archives/balancing-groups 模式的要点在这里

{
    (?>
        (?! { | } ) .
    |
        { (?<Depth>)
    |
        } (?<-Depth>)
    )*
    (?(Depth)(?!))
}

但请查看他的博客了解详情。