我正在尝试在.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.
有什么想法吗?如果可能,请提供一些解释。
答案 0 :(得分:1)
虽然我非常喜欢正则表达式,但在你的情况下它们不起作用,因为嵌套结构不是“常规”,因此无法与正则表达式匹配。你需要一个解析器来完成这种工作。遗憾。
答案 1 :(得分:1)
实际上可以在.NET中执行此操作来检查匹配的括号。关键是要使用平衡组。我之前听说过这就是我问这个问题的原因。我只是不确定如何自己编写表达式所以我希望一些常驻的reg专家可以帮助我:)
幸运的是我找到了这个网站。这解释了平衡组的细节......他甚至提供了一个模板。所以这里是其他人的参考。
http://blog.stevenlevithan.com/archives/balancing-groups 模式的要点在这里
{
(?>
(?! { | } ) .
|
{ (?<Depth>)
|
} (?<-Depth>)
)*
(?(Depth)(?!))
}
但请查看他的博客了解详情。