C# 用于从CS文件提取信息的正则表达式

C# 用于从CS文件提取信息的正则表达式,c#,.net,regex,C#,.net,Regex,下面是C#代码中CS文件行的快照,我试图从类文件中提取必填字段或支持字段 1)是否有一种方法可以让我动态地将cs文件加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息? 2)根据上述问题,我目前正在通过正则表达式提取信息。 第一个正则表达式-(m_oSupportedFields.)。+?(?=EnumSupported.Mandatory;| EnumSupported.Supported) 结果如下:- 第二个正则表达式-(..+)\= 结果如下: 我试图实现的是通过正则表达

下面是C#代码中CS文件行的快照,我试图从类文件中提取必填字段或支持字段

1)是否有一种方法可以让我动态地将cs文件加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息?

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

第一个正则表达式-(m_oSupportedFields.)。+?(?=EnumSupported.Mandatory;| EnumSupported.Supported)

结果如下:-

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

结果如下:

我试图实现的是通过正则表达式(一个正则表达式表示EnumSupported.Mandatory,一个正则表达式表示EnumSupported.Supported)来提取Persona.Forename、Personal.姓氏和其他字段

此外,我还试图迎合畸形线路,例如

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

m_osupportedfeelds.Personal.DOB.Day.Supported=enumsupportedfeelds.Supported; (请注意之间的双空格)

甚至

m_oSupportedFields.Personal.Lastname.Supported= 支持。强制性; (注意,枚举位于第二行)

请建议我如何编译这种情况下的正则表达式

谢谢

以文本版本更新

 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;

因此,从每一行中,您希望提取
m_oSupportedFields.
之后和
之前的部分。支持=
,以及
=
之后的部分。您只希望忽略
=
前面的空格,而忽略
=
后面的任何空格

您的正则表达式将是:
^m_oSupportedFields\([\w\.]+)\。受支持的*=\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

因此,从每一行中,您希望提取
m_oSupportedFields.
之后和
之前的部分。支持=
,以及
=
之后的部分。您只希望忽略
=
前面的空格,而忽略
=
后面的任何空格

您的正则表达式将是:
^m_oSupportedFields\([\w\.]+)\。受支持的*=\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) 有没有一种方法可以让我动态地将cs文件加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息

可能存在.Net编译器作为服务,VS2015()现在正在使用它。考虑创建一个新的应用程序

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

要创建一个模式,可以非常一般,也可以非常具体地描述需要捕获的内容。随着模式变得更加通用,模式复杂性随着提取数据的支持代码的增加而增加

捕获到可枚举的动态实体中

这是一种特定的模式,它获取结果并将其放入动态实体的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
                    }) 
字符串数据=@”
m_oSupportedFields.Personal.name.Supported=
支持。强制性;
m_oSupportedFields.Personal.Forename.Supported=enumsupportedfields.employment;
m_oSupportedFields.Personal.MiddleName.Supported=EnumSupported.Supported;
m_osupportedfeelds.Personal.DOB.Day.Supported=enumsupportedfeelds.Supported;
m_osupportedfeelds.Personal.DOB.Month.Supported=enumsupportedfeelds.Supported;
m_osupportedfeelds.Personal.DOB.Year.Supported=enumsupportedfeelds.Supported;
";
字符串模式=@“
个人\.#比赛锚定
(?#用于或条件的分组
(?[^.]+)#只是名字而已
|#或
(?[^.]+\[^.]+)#名称/子名称
)#结束或分组
(?=\.Supported)#展望锚定到受支持(不捕获)
\.支持
\s*=#可能的空格和=
[\s\r\n]*支持枚举\。
(?强制|支持)#捕获支持类型”;
//忽略模式空白允许我们对模式进行注释,而不是
//它在一条线上。无论如何,它不会影响正则表达式模式的处理。
Regex.Matches(数据、模式、RegexOptions.IgnorePatternWhitespace)
第()类
.选择(mt=>new
{
FullName=mt.Groups[“Full”].值,
IsName=mt.Groups[“Name”]。成功,
IsCombined=mt.Groups[“合并”]。成功,
类型=mt.Groups[“SupportType”].值
}) 
结果如下所示:

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

请注意,它可以确定提取的名称是来自单一类(名字)还是来自(日期)的双重类(名字),并捕获到命名捕获“全名”中,其中“名称”和“组合”捕获用作“is as”布尔值

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

可能存在.Net编译器作为服务,VS2015()现在正在使用它。考虑创建一个新的应用程序

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

要创建一个模式,可以是非常一般的,也可以是非常具体的