C# .NET正则表达式:如何在多行上检索多个匹配项
我有以下正则表达式:C# .NET正则表达式:如何在多行上检索多个匹配项,c#,.net,regex,C#,.net,Regex,我有以下正则表达式: \b((.|\n)*)=((.|\n)*)new((.|\n)*)\(\) 它用于从c#源代码字符串检测对象分配 像这样:var a=newperson() 当我只有一个匹配项时,它可以正常工作,但如果我尝试处理此问题: var a = new Person(); var x = new WebClient(); 它只返回一个匹配项,如下所示:{var a=new Person();var x=new WebClient()} 我需要提取两个匹配项。我是如何做到这一点的
\b((.|\n)*)=((.|\n)*)new((.|\n)*)\(\)
它用于从c#源代码字符串检测对象分配
像这样:var a=newperson()代码>
当我只有一个匹配项时,它可以正常工作,但如果我尝试处理此问题:
var a = new Person();
var x = new WebClient();
它只返回一个匹配项,如下所示:{var a=new Person();var x=new WebClient()}
我需要提取两个匹配项。我是如何做到这一点的,我对regex还比较陌生,不知道该怎么做
当我在RegExr上测试我的regex时,它工作得很好(选中了全局复选框) \n允许它匹配新行
这对我来说适用于expresso中的测试数据:
\b((.)*)=((.)*)new((.)*)\(\)
如果您不需要匹配的组(括号),这似乎也可以:
\b.*=.*new.*\(\)
这可能比使用更合适。(任何字符)
如果您确信代码基具有精确的间距(例如,由类似StyleCop的内容强制执行),那么您可以再次获得关于\w(单词字符)和\s(空格字符)的更具体信息
我也不确定这是否是故意的,但你没有匹配的;在行尾。\n允许它匹配新行
这对我来说适用于expresso中的测试数据:
\b((.)*)=((.)*)new((.)*)\(\)
如果您不需要匹配的组(括号),这似乎也可以:
\b.*=.*new.*\(\)
这可能比使用更合适。(任何字符)
如果您确信代码基具有精确的间距(例如,由类似StyleCop的内容强制执行),那么您可以再次获得关于\w(单词字符)和\s(空格字符)的更具体信息
我也不确定这是否是故意的,但你没有匹配的;在这行的末尾。这个表达式应该可以让您开始。尝试传入多行正则表达式选项,而不是尝试处理正则表达式本身中的换行:
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;
}
也就是说,有(远)比正则表达式更好的工具来处理C#解析,您对这些工具感兴趣吗?这个表达式应该让您开始学习。尝试传入多行正则表达式选项,而不是尝试处理正则表达式本身中的换行:
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;
}
也就是说,有(远)比正则表达式更好的工具来处理C#解析,您对这些工具感兴趣吗?您可以使用命名组。我将模式修改为以下内容,名为asgn
的组将匹配整个分配:
(?<asgn>\b\w+\s+\w+\s*\=\s*new\s+\w+\([^)]*\)\s*;)
(?\b\w+\s+\w+\s*\=\s*新的\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);
}
string pat=@“(?\b\w+\s+\w+\s*\=\s*新的\s+\w+\([^]*\)\s*)”;
字符串输入=@“var a=new Person();
var x=新的WebClient();“;
foreach(正则表达式中的匹配m.Matches(输入,pat))
{
Console.WriteLine(m.Groups[“asgn”].值);
}
如果需要解析和提取分配的每个部分,可以将更多组命名到模式中,如下所示:
(?<asgn>\b(?<vtype>\w+)\s+(?<name>\w+)\s*\=\s*new\s+(?<type>\w+)\((?<args>[^)]*)\)\s*;)
(?\b(?\w+)\s+(?\w+)\s*\=\s*新的\s+(?\w+)\((?[^)]*)\s*;)
您可以使用它从匹配的字符串中提取变量类型、变量名称、类型和构造函数参数。您可以使用命名组。我将模式修改为以下内容,名为asgn
的组将匹配整个分配:
(?<asgn>\b\w+\s+\w+\s*\=\s*new\s+\w+\([^)]*\)\s*;)
(?\b\w+\s+\w+\s*\=\s*新的\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);
}
string pat=@“(?\b\w+\s+\w+\s*\=\s*新的\s+\w+\([^]*\)\s*)”;
字符串输入=@“var a=new Person();
var x=新的WebClient();“;
foreach(正则表达式中的匹配m.Matches(输入,pat))
{
Console.WriteLine(m.Groups[“asgn”].值);
}
如果需要解析和提取分配的每个部分,可以将更多组命名到模式中,如下所示:
(?<asgn>\b(?<vtype>\w+)\s+(?<name>\w+)\s*\=\s*new\s+(?<type>\w+)\((?<args>[^)]*)\)\s*;)
(?\b(?\w+)\s+(?\w+)\s*\=\s*新的\s+(?\w+)\((?[^)]*)\s*;)
您可以使用它从匹配的字符串中提取变量类型、变量名称、类型和构造函数参数。这正是我需要的,谢谢。是的,您可以推荐什么工具,我已经安装了Express..nFactory包括一个C#解析器,Roslyn项目可能会有所帮助。Roslyn很酷,但问题是我正在为android开发,使用mono。那么nReporty正是你想要的,我认为,它是mono友好的(事实上内部使用mono.Cecil)听起来很棒,我会去看看。这正是我需要的,谢谢。是的,您可以推荐什么工具,我已经安装了Express..nFactory包括一个C#解析器,Roslyn项目可能会有所帮助。Roslyn很酷,但问题是我正在为android开发,使用mono。那么nReporty正是你想要的,我认为,它是mono友好的(事实上内部使用mono.Cecil)听起来很棒,我会去看看。TyvmJust out out interest匹配注释掉的代码、包含强制类型转换等的赋值是否重要。新阵列怎么样?/*变量a=新的人();*/变量b=(新的人作为人);嗯,是的,但我才刚刚开始,我想我必须弄清楚,在这种情况下,仅仅使用正则表达式将走到死胡同。尝试研究解析器的功能。正则表达式只在标记C#之类的语言时才真正有用。谢谢你的提示,我会记住的!只是出于兴趣,匹配注释掉的代码、包含强制类型转换等的赋值是否重要。新阵列怎么样?/*变量a=新的人();*/变量b=(新的人作为人);嗯,是的,但我才刚刚开始,我想我必须弄清楚,在这种情况下,仅仅使用正则表达式将走到死胡同。尝试研究解析器的功能。正则表达式只在标记C#之类的语言时才真正有用。谢谢你的提示,我会记住的!