【问题标题】:How to declare regex for inheritance(class childclass : baseclass) type?如何为继承(类子类:基类)类型声明正则表达式?
【发布时间】:2019-04-05 06:42:48
【问题描述】:

如何在正则表达式中声明继承格式?

我已经尝试了下面指定的所有情况,但 Regex.IsMatch 总是返回 false

class \w\W+[:\s\w,]+
class \w+[\s?][\s:[\s?]\w,]+
class \w\s+[\s:\s\w]

我需要设置继承的正则表达式(类子类:基类),格式应该返回true(Regex.IsMatch),对于以下测试用例它返回false:

公共类子类:基类

【问题讨论】:

  • 考虑到很难确定(如果可能的话)':' 字符的右侧是一个类还是一个接口。
  • 如果您想获得准确的结果(与编译器“看到”相同),您可以使用Roslyn,因为这样您就可以访问编译器本身,但这可能有点太复杂了,取决于你的用例。
  • 当正则表达式设置为 class \w+[\s:\w] 时返回 true,但在这种情况下 class 不被视为关键字。
  • 一般情况下,你想要一个解析器,正则表达式很难匹配,比如myClass : /* comment */ baseClassclass myClass : // /* broken comment\r\n : baseClass // ...*/ 而不匹配@"string - class myClass : baseClass"
  • 我认为那些正则表达式并没有像你想象的那样做任何事情。您不能嵌套字符类,并且 [?] 匹配文字 ?这当然不是你想要的。您的测试用例的正则表达式是 class\s+\w+\s*:\s*\w+

标签: c# regex


【解决方案1】:

请尝试this正则表达式

(public|private|internal|protected)(部分)\s类\s+(/*.*/)\s \w+[\s]\s+(/*.*/)\s:\s+(/*.*/)\s *\s*(\w+,*\w+)

【讨论】:

  • 没有 Regex.IsMatch 返回为 false。
  • 这做了太多的假设:例如public/private 不是必需的,内部呢,你可以在冒号前后使用任意数量的空格等等......
  • 请看一下我认为有效的链接
  • @Mahmoud-Abdelslam:更好但仍然有很多问题:例如partial关键字,或者,如果用户在类和基类之间键入任何注释,这在语法上也是合法的
  • @FlatEric 好的,我会匹配这个
【解决方案2】:

满足您条件的简单模式示例:\w+ class \w+ : \w+(一个单词、类关键字、类名、冒号、基类名)。

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var input = @"
using System;

public class ChildClass : BaseClass
{
}
";
        var pattern = @"\w+ class \w+ : \w+";
        var isMatch = Regex.IsMatch(input, pattern);
        var matches = Regex.Matches(input, pattern);

        Console.WriteLine(isMatch);
        Console.WriteLine(matches.Count);
        Console.WriteLine(matches[0]);
    }
}

输出:

True
1
public class ChildClass : BaseClass

https://dotnetfiddle.net/K9RNbJ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-02-20
    • 2022-12-04
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多