C# 用于从CS文件提取信息的正则表达式
下面是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= 支持。强制性; (注意,枚举位于第二行) 请建议我如何编译这种情况下的正则表达式 谢谢 以文本版本更新C# 用于从CS文件提取信息的正则表达式,c#,.net,regex,C#,.net,Regex,下面是C#代码中CS文件行的快照,我试图从类文件中提取必填字段或支持字段 1)是否有一种方法可以让我动态地将cs文件加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息? 2)根据上述问题,我目前正在通过正则表达式提取信息。 第一个正则表达式-(m_oSupportedFields.)。+?(?=EnumSupported.Mandatory;| EnumSupported.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姓氏和其他字段
要创建一个模式,可以是非常一般的,也可以是非常具体的