Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET正则表达式:如何在多行上检索多个匹配项_C#_.net_Regex - Fatal编程技术网

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#之类的语言时才真正有用。谢谢你的提示,我会记住的!