我正在尝试使用正则表达式提取宏名称及其背后的代码,并希望将它们保存在一起!我要扫描的头文件看起来像这样:
#define TEST_MAKRO (ival) \
{ \
somevalue = ival; \
}
#define TEST_MAKRO2 (ival1, ival2, retval) \
{ \
retval = ival1 + ival2; \
}
#define TEST_MASK 0x123 \
现在我试图匹配#define(没有param)和整个#define until}这样:
string makroexp1 = @"(#define+(\s)+[^()]*)";
string makroexp2 = @"define+(.*\\\n)+(\})";
string[] lines = File.ReadAllLines(path);
string temporarystring = "";
foreach (string line in lines)
{
temporarystring += line;
temporarystring += "\n";
}
foreach (Match makroname in Regex.Matches(temporarystring, makroexp1)){
//somehow add to dictonary (this should be the key)
}
foreach (Match replacement in Regex.Matches(temporarystring, makroexp2)){
//add to dictionary (this should be the value of the corresponding key)
}
它实际上有点工作(匹配),但我找不到将它们组合在一起的好方法......类似于:
makrodic.Add(makroname.Value, replacement.Value)
不能工作obv:/
答案 0 :(得分:1)
使用
@"#define\s+(\w+).*\\(?:\s*{((?:.*\\\s+)*)})?"
请参阅regex demo
然后,match.Groups[1].Value
是名称(TEST_MAKRO
),match.Groups[2].Value
是内容。
<强>详情:
#define
- 文字子字符串\s+
- 一个或多个空格(\w+)
- 第1组匹配一个或多个字词.*\\
- 除了换行符之外的任何0 +字符,直到最后一行\
后面跟着... (?:\s*{((?:.*\\\s+)*)})?
- 一个可选的非捕获组,匹配以下序列:
\s*
- 0+ whitespaces {
- {
((?:.*\\\s+)*)
- 第2组:0+序列:
.*
- 尽可能多的换行以外的任何0 +字符\\
- \
符号\s+
- 1+空格}
- }
答案 1 :(得分:0)
也许这给你一个很好的起点(需要调整单行宏):
var macros = new Dictionary<string, string>();
var regex = new Regex(@"#define +(\w+).*\n\{([^\{\}]+)\}");
foreach (Match m in regex.Matches(File.ReadAllText(path)))
{
macros[m.Groups[1].ToString()] = m.Groups[2].ToString();
}
答案 2 :(得分:0)
感谢帮助人员,我的最终解决方案看起来像这样! (感谢@WiktorStribiżew)
string makroexp = @"#define\s+(\w+).*\\(?:\s*{((?:.*\\\s+)*)})?";
string[] lines = File.ReadAllLines(Path.GetFullPath(....));
string temporarystring = "";
string[] keys = new string[0];
string[] values = new string[0];
foreach (string line in lines)
{
temporarystring += line;
temporarystring += "\n";
}
try
{
makrodic.Add(makro.Groups[1].Value, makro.Groups[2].Value);
}
catch
{
//Already added
}