我想匹配(从类文件中选择)methodsname,属性名称和字段名称。
这是示例类:
class Perl
{
string _name;
public string Name { get; set; }
public Perl()
{
// Assign this._name
this._name = "Perl";
// Assign _name
_name = "Sam";
// The two forms reference the same field.
Console.WriteLine(this._name);
Console.WriteLine(_name);
}
public static string doSomething(string test)
{
bla test;
}
}
我得到了方法的代码:
(?:public|private|protected)([\s\w]*)\s+(\w+)\s*\(\s*(?:\w+\s+(\w+)\s*,?\s*)+\)
我有疑问:
答案 0 :(得分:3)
使用此Regex
方法
(?:public\s|private\s|protected\s|internal\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>\w+)\s+(?<parameter>\w+)\s*,?\s*)+\)
并获取名为methodName
和parameterType
以及parameter
的小组。
和字段:
(?:public\s|private\s|protected\s)\s*(?:readonly\s+)?(?<type>\w+)\s+(?<name>\w+)
并获取名为type
和name
的小组。
例如,您的方法代码可以是这样的:
var inputString0 = "public void test(string name, out int value)\r\nvoid test(string name, int value)";
foreach (Match match in Regex.Matches(inputString0, @"(?:public\s|private\s|protected\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>[\w\?\[\]]+)\s+(?<parameter>\w+)\s*,?\s*)+\)"))
{
var methodName = match.Groups["methodName"].Value;
var typeParameterPair = new Dictionary<string, string>();
int i = 0;
foreach (var capture in match.Groups["parameterType"].Captures)
{
typeParameterPair.Add(match.Groups["parameterType"].Captures[i].Value, match.Groups["parameter"].Captures[i].Value);
i++;
}
}
您也可以使用 codeplex 中的Irony - .NET Language Implementation Kit。
答案 1 :(得分:2)
正如您对答案的评论中所述,更可靠的方法是编译您的.cs文件,然后使用反射来询问您感兴趣的成员的类型。它将涉及以下内容:
Process
class以编程方式执行csc.exe。答案 2 :(得分:0)
诸如C#之类的语言在语句语法中接受太多变化,只能使用正则表达式进行解析。在正则表达式之上,您需要一个上下文语法分析器。
我会尝试Roslyn:它是一个C#编译器,其内部可以从您的代码中访问。让Roslyn解析代码并查询它所需的任何信息。
答案 3 :(得分:0)
我建议查看Microsoft.VisualStudio.CSharp.Services.Language
命名空间和其他 Visual Studio可扩展性功能。这将消除编译的需要。