与包含指定字符的句子不匹配

时间:2012-08-12 16:25:33

标签: c# regex

我试图在课堂上匹配属性。示例类:

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

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

3 个答案:

答案 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#代码分析,请尝试IronyThe Roslyn Project,请参阅此示例: