从CS文件中提取信息的正则表达式

时间:2015-09-15 04:22:48

标签: c# .net regex

下面是来自我的C#代码的CS文件中的行的快照,我正在尝试从我的类文件中提取字段必需或支持的字段。

1)有没有办法让我将cs文件动态加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息?

2)在上述问题之后,我目前正在通过正则表达式提取信息。

First Regex - (m_oSupportedFields。)。+?(?= EnumSupported.Mandatory; | EnumSupported.Supported)

结果如下: - Pic1

第二个正则表达式 - (.. +)\ =

结果如下: -

Pic2

我想要实现的是通过Regex(EnumSupported.Mandatory的一个Regex和EnumSupported.Supported的一个Regex)提取Persona.Forename,Personal.Surname和其他字段。

另外,我正在努力迎合格式错误的行,例如

m_oSupportedFields.Personal.DOB.Day.Supported = EnumSupported.Supported; (注意等号之间的空格)

m_oSupportedFields.Personal.DOB.Day.Supported = EnumSupported.Supported; (注意之间的双重空格)

甚至

m_oSupportedFields.Personal.Surname.Supported =                 EnumSupported.Mandatory; (注意Enum在第二行)

请告知如何针对这种情况编译正则表达式。

感谢。

在文字版本中更新

 m_oSupportedFields.Personal.Surname.Supported = EnumSupported.Mandatory;
            m_oSupportedFields.Personal.Forename.Supported = EnumSupported.Mandatory;
            m_oSupportedFields.Personal.MiddleName.Supported = EnumSupported.Supported;
            m_oSupportedFields.Personal.DOB.Day.Supported = EnumSupported.Supported;
            m_oSupportedFields.Personal.DOB.Month.Supported = EnumSupported.Supported;
            m_oSupportedFields.Personal.DOB.Year.Supported = EnumSupported.Supported;

2 个答案:

答案 0 :(得分:2)

因此,从每一行开始,您需要在m_oSupportedFields.之后和.Supported =之前以及=之后的部分提取部分。并且您希望在=之前仅忽略空格,而在=之后忽略任何空格。

您的正则表达式为:^m_oSupportedFields\.([\w\.]+)\.Supported *=\s*(EnumSupported\.\w+);

如果您不想要求字符串从一行的开头开始,请忽略^

使用C#,您可以像这样访问匹配组:

using System.Text.RegularExpressions;

string regex = @"^m_oSupportedFields\.([\w\.]+)\.Supported *=\s*(EnumSupported\.\w+);";
string input = @"m_oSupportedFields.Personal.DOB.Day.Supported=EnumSupported.Supported";

foreach (Match m in Regex.Matches(input, regex))
{
    Console.WriteLine(m.Captures[0].ToString());
    Console.WriteLine(m.Captures[1].ToString());
}

// Console:

// Personal.DOB.Day
// EnumSupported.Supported

答案 1 :(得分:2)

  

1)有没有办法让我将cs文件动态加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息?

可能有.Net编译器即服务,现在由VS2015(Overview)使用。考虑创建Stand-Alone Code Analysis Tool

  

通过正则表达式提取Persona.Forename,Personal.Surname和其他字段(一个Regex用于EnumSupported.Mandatory,一个用于EnumSupported.Supported)。

要创建模式,可以非常通用,或者可以非常具体地确定需要捕获的模式。当使模式更通用时,模式复杂性随着支持代码的增加而提高数据。

捕获到可枚举的动态实体

这是一个特定的模式,它将结果放入Linq动态实体集中。 **请注意,它处理可能的行拆分**

string data = @"
m_oSupportedFields.Personal.Surname.Supported =
EnumSupported.Mandatory;
 m_oSupportedFields.Personal.Forename.Supported=EnumSupported.Mandatory;
m_oSupportedFields.Personal.MiddleName.Supported = EnumSupported.Supported;
m_oSupportedFields.Personal.DOB.Day.Supported = EnumSupported.Supported;
m_oSupportedFields.Personal.DOB.Month.Supported = EnumSupported.Supported;
m_oSupportedFields.Personal.DOB.Year.Supported = EnumSupported.Supported;
";

string pattern = @"
Personal\.                          # Anchor for match
(?<Full>                            # Grouping for Or condition
   (?<Name>[^.]+)                   # Just the name
  |                                 # Or
   (?<Combined>[^.]+\.[^.]+)        # Name/subname
)                                   # End Or Grouping
(?=\.Supported)                     # Look ahead to anchor to Supported (does not capture)
\.Supported
\s*=                                # Possible whitespace and =
[\s\r\n]*EnumSupported\.
(?<SupportType>Mandatory|Supported) # Capture support type";

// Ignore Pattern whitespace allows us to comment the pattern instead of having
// it on oneline. It does not affect regex pattern processing in anyway.
Regex.Matches(data, pattern, RegexOptions.IgnorePatternWhitespace)
     .OfType<Match>()
     .Select (mt => new
                    {
                       FullName   = mt.Groups["Full"].Value,
                       IsName     = mt.Groups["Name"].Success,
                       IsCombined = mt.Groups["Combined"].Success,
                       Type       = mt.Groups["SupportType"].Value
                    }) 

结果如下:

enter image description here

请注意,它可以确定提取的名称是否来自(DOB.Day)中的单个,如(ForeName)或 double 捕获到命名捕获“FullName”,其中“Name”和“Combined”捕获用作“Is-As”布尔值。