我正在编写在 C++ 源文件上运行的 C# 程序并寻找以下内容:
#define SOMETHING_A 99
和
typedef enum {
EX_A,
EX_B,
EX_C,
EX_D,
EX_E
} Examples;
和
enum EXAMPLE2
{
EX2_A=0,
EX2_B=1,
EX2_C=2,
EX2_D=3,
EX2_LAST = EX2_D
};
我的目标是获得以下对列表作为输出:
{SOMETHING_A,99}
{EX_A,0}
{EX_B,1}
..
..
{EX2_A,0}
{EX2_B,1}
..
..
你能帮我找到符合上述 3 种模式的正确正则表达式吗?
最佳答案
如果您想要一个适用于任何 C++ 文件的解决方案,请使用解析器而不是正则表达式。有太多的可能性需要考虑(不同的代码风格、被注释掉的代码等)。
如果您只想对一组已知文件执行此操作,并且它们具有可预测的格式和样式,则正则表达式可能没问题。实际上,您最好使用多个正则表达式:
/^#define\s+(\S+)\s+(\S+)/
这只匹配位于行首的定义语句。
这是 typedef 枚举:
/^\s*typedef\s+enum\s*\{[^\}]+\}[^;]+;/
(不清楚你想从这个抓取什么,所以我没有抓取到任何东西)。
这是枚举。这最好分两步完成:
/^\s*enum\s+(\S+)\s*\{\s*([^\}]+?)\s*\}\s*;/
第一步获取第一个捕获组中枚举的名称和第二个组中的内容。对第二个捕获组执行正则表达式以获取字段和值:
/(\S+)\s*=\s*([^\s\,]+)/
每次匹配都会给你一个名称/值对。
这些正则表达式应该可以处理您的示例,并且它们应该能够很好地处理 C++ 代码中最常见的用法。但它们并不完美;如果您想要一个涵盖所有可能构造的解决方案,请不要使用正则表达式。
注意:您需要确保 match_single_line
flag使用这些时关闭。
关于c# - 使用 C# Regex 查找 C++ 代码模式(定义和 emuns),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15001156/