下面是来自我的C#代码的CS文件中的行的快照,我正在尝试从我的类文件中提取字段必需或支持的字段。
1)有没有办法让我将cs文件动态加载到.NET应用程序中,并从文件路径加载cs文件开始提取信息?
2)在上述问题之后,我目前正在通过正则表达式提取信息。
First Regex - (m_oSupportedFields。)。+?(?= EnumSupported.Mandatory; | EnumSupported.Supported)
第二个正则表达式 - (.. +)\ =
结果如下: -
我想要实现的是通过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;
答案 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
})
结果如下:
请注意,它可以确定提取的名称是否来自(DOB.Day)中的单个,如(ForeName)或 double 捕获到命名捕获“FullName”,其中“Name”和“Combined”捕获用作“Is-As”布尔值。