0

我试图匹配类中的属性。示例类:

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+)[^(]

它不仅匹配属性,还匹配错误的方法。所以我想从包含(的匹配句子中删除。所以它选择所有但不包含方法的方法(包含( )。我怎样才能做到这一点。

4

3 回答 3

2

尝试匹配 the"{""get {"the

(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)

where\b匹配一个词的开头或(在这种情况下)一个词的结尾。

于 2012-08-12T16:34:45.473 回答
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
}
于 2012-08-12T18:49:18.350 回答
1

根据这个答案,尝试使用:

对于Properties:typename:

(?:public\s|private\s|protected\s|internal\s)\s*(?:readonly|static\s+)?(?<type>\w+)\s+(?<name>\w+)[\s\r\n]*{

对于Fields:typename:

(?:public\s|private\s|protected\s)\s*(?:readonly|static\s+)?(?<type>\w+)\s+(?<name>\w+);

对于Methods:methodName和: parameterType_parameter

(?: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*)+\)

对于 c# 代码分析,请尝试IronyThe Roslyn Project,请参阅此示例:

于 2012-08-13T05:07:53.810 回答