.NET Regex:如何在多行上检索多个匹配项

时间:2013-01-31 13:25:51

标签: c# .net regex

我有以下正则表达式:

\b((.|\n)*)=((.|\n)*)new((.|\n)*)\(\)

它用于从c#源代码字符串中检测对象分配

像这样:var a = new Person();

当我只有一场比赛时,它可以正常工作,但如果我尝试处理这个:

var a = new Person();
var x = new WebClient();

它只返回一个匹配项,如下所示:{var a = new Person(); var x = new WebClient()}

我需要提取两个匹配项。我该怎么做,我对正则表达式相对较新,我不知道该怎么做。

当我在RegExr上测试我的正则表达式时,它运行正常(检查了全局复选框)..

3 个答案:

答案 0 :(得分:1)

\ n允许它匹配新行。

这适用于我在expresso中的测试数据:

\b((.)*)=((.)*)new((.)*)\(\)

如果你不需要匹配的组 - 括号 - 这似乎也有效:

\b.*=.*new.*\(\)

这可能比使用更合适。 (任何角色)。

\b[\w\s]*=[\w\s]*new[\w\s]*\(\)

如果您确信代码库具有精确的间距(例如,由StyleCop强制执行),那么您可以再次了解\ w(单词字符)和\ s(空格字符)。

此外,我不确定这是否是故意的,但你不匹配;在最后一行。

答案 1 :(得分:1)

这个表达式应该让你入门。尝试传递Multiline正则表达式选项,而不是尝试处理正则表达式本身的换行符:

var src = @"var a = new Person();
var x = new WebClient();";
var pattern = @"(\w+\s*)(\w*\s*)=\s+new\s+(\w+)\(\)";
var expr = new System.Text.RegularExpressions.Regex(pattern,RegexOptions.Multiline);
foreach(Match match in expr.Matches(src) )
{
    var assignType = match.Groups[1].Value;
    var id = match.Groups[2].Value;
    var objType = match.Groups[3].Value;        
}

也就是说,有很多(比)RegEx更好的工具来处理C#解析,你对它们感兴趣吗?

答案 2 :(得分:1)

您可以使用命名组。我将模式修改为以下内容,名为asgn的组将匹配整个分配:

(?<asgn>\b\w+\s+\w+\s*\=\s*new\s+\w+\([^)]*\)\s*;)

这是访问命名组的方法:

string pat = @"(?<asgn>\b\w+\s+\w+\s*\=\s*new\s+\w+\([^)]*\)\s*;)";
string input = @"var a = new Person();
                var x = new WebClient();";
foreach (Match m in Regex.Matches(input, pat))
{
    Console.WriteLine(m.Groups["asgn"].Value);
}

如果您需要解析并提取作业的每个部分,可以在模式中命名更多的组,如下所示:

(?<asgn>\b(?<vtype>\w+)\s+(?<name>\w+)\s*\=\s*new\s+(?<type>\w+)\((?<args>[^)]*)\)\s*;)

您可以从匹配的字符串中提取变量类型,变量名称,类型和构造函数args。