0

我有以下正则表达式:

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

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

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

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

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

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

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

当我在 RegExr 上测试我的正则表达式时,它工作得很好(选中了全局复选框)..

4

3 回答 3

1

\n 允许它匹配新行。

这对我来说适用于你在 expresso 中的测试数据:

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

如果您不需要匹配组 - 括号 - 这似乎也可以:

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

这可能比使用更合适。(任何字符)。

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

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

另外我不确定这是否是故意的,但你不匹配 ; 在行尾。

于 2013-01-31T13:36:06.950 回答
1

这个表达式应该让你开始。尝试传入 Multiline regex 选项,而不是尝试在 regex 本身中处理换行符:

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# 解析,你对这些感兴趣吗?

于 2013-01-31T13:36:10.943 回答
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*;)

您可以使用它从匹配的字符串中提取变量类型、变量名称、类型和构造函数参数。

于 2013-01-31T13:39:29.050 回答