我试图在课堂上匹配属性。示例类:
public static string ComingSoonPage
{
get { return "/blog-coming-soon.aspx"; }
}
public static string EncodeBase64(string dataToEncode)
{
byte[] bytes = System.Text.ASCIIEncoding.UTF8.GetBytes(dataToEncode);
string returnValue = System.Convert.ToBase64String(bytes);
return returnValue;
}
我正在使用这种正则表达式:
(?:public|private|protected)([\s\w]*)\s+(\w+)[^(]
它不仅匹配属性,还匹配错误的方法。所以我想从匹配句子中删除(。所以它选择所有但不是方法(包含()。我怎样才能实现。
答案 0 :(得分:2)
尝试匹配"{"
和"get {"
(public|private|protected|internal)[\s\w]*\s+(\w+)\s*\{\s*get\s*\{
<强>更新强>
仅匹配属性的名称
(?<=(public|private|protected|internal)[\s\w]*\s+)\w+(?=\s*\{\s*get\s*\{)
使用一般模式
(?<=prefix)find(?=suffix)
修改强>
一个属性可能根本没有修饰符(public,private等),类型可能包含额外的字符(例如对于数组int[,]
。因此,测试后面的语法元素可能会更好。属性名称(和名称本身)。另外一个属性可以只包含一个setter并且是抽象的:abstract int[,] Matrix { set; }
。我建议检索这样的属性名称:
\w+(?=\s*\{\s*(get|set)\b)
其中\b
匹配单词开头或(在本例中)单词结尾。
答案 1 :(得分:1)
这可能是您正在寻找的,这非常有效!我应该得到一些待遇:)......
Regex r=new Regex(@"(public|private).*?(?=(public|private|$))",RegexOptions.Singleline);
Regex nr=new Regex(@"\(.*?\)\s+\{",RegexOptions.Singleline);
foreach(Match m in r.Matches(yourCodeFile))//extracts all methods and properties
{
if(!nr.IsMatch(m.Value))//shoots down methods
m.Value;//properties only
}
答案 2 :(得分:1)
根据this answer,请尝试使用:
Properties
: type
和 name
:
(?:public\s|private\s|protected\s|internal\s)\s*(?:readonly|static\s+)?(?<type>\w+)\s+(?<name>\w+)[\s\r\n]*{
Fields
: type
和 name
:
(?:public\s|private\s|protected\s)\s*(?:readonly|static\s+)?(?<type>\w+)\s+(?<name>\w+);
Methods
: methodName
和 parameterType
和 {{1} } :
parameter
对于c#代码分析,请尝试Irony或The Roslyn Project,请参阅此示例: