用于匹配C#属性getter的正则表达式

时间:2016-11-23 10:38:58

标签: c# regex

为了进行代码审查和解决问题,我需要能够忽略大型解决方案中的所有属性获取者。我正在思考" 正则表达式 Powershell 来拯救"。

我需要一个匹配C#文件中所有getter的 rexeg模式。 例如,如果这是测试字符串:

public string MockFullName
{
    get
    {
        string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
        return string.Format("{0}.Mock{1}", ns, Name);
    }
}

我需要匹配 be:

get
{
    string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
    return string.Format("{0}.Mock{1}", ns, Name);
}

我已经在https://regex101.com/玩了模式......

get(.|\n)*{(.|\n)*}

...这让我太过分了 - 包括课堂上的结束括号。

在PowerShell中键入此内容并不能为给定的C#文件提供任何内容:

sls 'get(.|\n)*{(.|\n)*}' MyCSharpFileWithAProperty.cs

那么,什么样的正则表达式会迎合这个?

谢谢, POM

PS:对于记录,我对短格式属性感兴趣,可以跳过它们:

public string Name { get; set; }

4 个答案:

答案 0 :(得分:1)

假设您的文件正确缩进(即:不混合制表符和空格),一种解决方案是使用以下代码:

Regex r = new Regex(@"get\s*?
                        ^(\s+){
                        [\s\S]*?
                        ^\1}", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);

var matches = r.Matches(input);
foreach(Match m in matches)
{
    Console.WriteLine(Regex.Replace(m.Value, "^" + m.Groups[1].Value, "", RegexOptions.Multiline));
}

反对:

public string MockFullName
{
    get
    {
        string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
        return string.Format("{0}.Mock{1}", ns, Name);
        if(true)
        {
            DoStuff();
        }
    }
}

public string MockFullName
{
    get
    {
        string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
        return string.Format("{0}.Mock{1}", ns, Name);
    }
}

将输出:

get
{
    string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
    return string.Format("{0}.Mock{1}", ns, Name);
    if(true)
    {
        DoStuff();
    }
}

get
{
    string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
    return string.Format("{0}.Mock{1}", ns, Name);
}

答案 1 :(得分:0)

试试这个:

int count  = //get the total number of such records from the database
if (comboBox4.SelectedIndex != (count -1))
{
    comboBox4.SelectedIndex = comboBox4.SelectedIndex + 1;
}

也许它需要一些定制,但是一开始我觉得很好。

更新: 对于包含单词“get”的方法,上面的代码可能会失败,因此经过一点修改后,这个模式应该可以解决问题:

Match match = Regex.Match(input, @"(get[\S\s]*})\s*}");
string asd = match.Groups[1].Value;

答案 2 :(得分:0)

在c#中,这将得到\s*\{(?:[^{}]*|(?<open> \{ )|(?<-open> \}))+(?(open)(?!))\},这是对此2014 W3C Recommendation的第一个awnser的略微修改版本。如果您使用的是影响prce正则表达式的语言,则可以使用get \ s *({[^ {}] (?1)})。

c#one的工作原理是通过所有测试并添加它找到的任何开口括号,如果它找到一个结束括号,它会使用?&lt; -open&gt; (.net balance groups)删除组打开的最后一个匹配项。这又回到了那个问题上。如果没有匹配可用,则失败,这允许正则表达式平衡括号。最后它使用(?(打开)(?!))来检查打开时是否有剩余的匹配,如果有失败的话。这有效地意味着支架的数量必须匹配。

我希望这就是你想要的。

答案 3 :(得分:0)

不是正则表达式,也不是自定义反射或Roslyn。你考虑过NDepend了吗?

  • 其CQLinq语法允许您查询项目中的所有getter
  • 您可以将其集成到现有的CI设置中:根据CQlinq查询定义警告和错误阈值;你可以看到他们的代码质量守卫。错误可以“停止”。以CI为例。
  • 它的开箱即用,并提供了许多其他审查和检查功能。无需投资定制解决方案。

显示查询结果的示例图像(注意方法而非属性的示例查询)。

example quering for methods