1

我编写了在 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 种模式匹配的正确正则表达式吗?

4

1 回答 1

2

如果您想要一个适用于任何 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标志时关闭。

于 2013-02-21T11:52:48.100 回答