【问题标题】:Regex to match property types C#正则表达式匹配属性类型 C#
【发布时间】:2015-10-29 17:21:28
【问题描述】:

我有一个程序,我必须检查是否有任何自动属性类型与类名匹配。

所以,例如,如果我有:

public class User 
{
   //Some code here
}


public class Cars
{
  public string Brand {get; set;}
  public string YearModel {get; set;}
  public List<User> HasRented {get; set;}
}

现在,我已经有了匹配类名的代码,所以我可以从“公共类用户”中获取名称“用户”。问题是,我需要正则表达式从“public List&lt;User&gt; HasRented {get; set;}”获取“List&lt;User&gt;”。当然,我想获取所有的属性类型。所以我也希望这两个“字符串”在正则表达式上匹配。

如果有帮助的话,我已经有了一个获取属性名称的正则表达式,所以也许有人可以帮我修改它以获取属性类型?

正则表达式: \w+(?=\s*{\s*get\b)

编辑:忘了提到我将源作为字符串,这就是为什么我想将它与正则表达式匹配。更清楚一点:我需要帮助的唯一事情是正则表达式从包含填充有自动属性的类的文本中获取属性类型。与类名不匹配。

【问题讨论】:

  • 只是为了让我正确理解这一点:您将源作为 string 并希望从中提取信息?代码没有编译到你的程序集中,所以你可以直接使用Cars 和User 类型吗?
  • 如果你想从 C# 源代码中提取信息,为什么不使用 Roslyn?似乎它会比正则表达式更可靠...
  • 是的,对不起。忘了说我有一个字符串的来源。
  • public\s(?[^\s]+)\s[^\s]+\s\{[^\}\n]+\}
  • Rinecamo 我在regexr 上尝试了你的正则表达式,但没有匹配到

标签: c# regex


【解决方案1】:

使用正则表达式来解析代码是没有用的,因为属性的类型不限于 1 级泛型,可以是任何类似的东西

List<SortedList<string, User>>

在这种情况下,最好让 C# 编译器 (csc) 来完成这项工作。

我假设代码当然可以编译,因为您的源代码缺少 System.Collections.Generic 所需的 using 语句;

这里是编译源代码的代码:

    CSharpCodeProvider prov = new CSharpCodeProvider();
    CompilerResults results = prov.CompileAssemblyFromFile(new System.CodeDom.Compiler.CompilerParameters(), new string[] { "c:\\temp\\code.txt" });
    if (results.Errors.Count == 0)
    {
        Assembly assembly = results.CompiledAssembly;
        foreach (Type type in assembly.GetTypes())
        {
            Console.WriteLine("Type: {0}", type.Name);
            foreach (PropertyInfo pi in type.GetProperties())
            {
                Console.WriteLine("    Property: {0}, Return Type: {1}", pi.Name, pi.PropertyType);
            }
        }
    }

这是输出:

Type: User
Type: Cars
    Property: Brand, Return Type: System.String
    Property: YearModel, Return Type: System.String
    Property: HasRented, Return Type: System.Collections.Generic.List`1[User]

【讨论】:

  • 谢谢,但那不是我的情况。就我而言,正则表达式可以做到这一点。
【解决方案2】:

您可以通过以下方式获取名称和类型:

(?<type>[^\s]+)\s(?<name>[^\s]+)(?=\s\{get;)

DEMO 或者直接输入:

(\S+(?:<.+?>)?)(?=\s\w+\s\{get;)

DEMO

【讨论】:

  • 谢谢!第二个正则表达式正是我想要的。
  • 实际上,我也需要第一个正则表达式。如果我能给你两次投票,先生,我会的!
  • @Jokerish 然后最好修改它以匹配第二个,检查HERE,没有它它不会匹配更复杂的泛型类型
【解决方案3】:

带有修饰符 global 和 multiline 的正则表达式 ^\s*public\s+([^\s]+)\s+[^\s]+\s+\{[^\}\n]+\} 将返回属性的类名

【讨论】:

  • 嗨,基思。也许我有点不清楚,但我已经有代码来检查正则表达式的返回值是否与类名匹配。我需要的唯一代码实际上是匹配属性类型的正则表达式。所以如果属性是public string Name { get; set; },正则表达式应该匹配string。如果属性为public List&lt;User&gt; HasRented { get; set; },则正则表达式应匹配List&lt;User&gt;。如果有一个类具有多个属性,则正则表达式应匹配该类中的所有属性类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多