c# - 使用 C# Regex 查找 C++ 代码模式(定义和 emuns)

标签 c# c++ regex

我正在编写在 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/

相关文章:

c++ - 删除shallow的复制对象和origin对象

c++ - 什么时候需要提前声明?

c++ - 为 Structs C++ 的 vector 创建大小时出错

php - 只允许字母、数字和一些外文字母?

c# - 如何根据用户请求调用 WebUserControls?

c# - C#中的double(C++)是什么?

c# - 带下划线的 Newton CamelCase 问题

regex - 如何根据特定模式分割 CSV 行

用于从 Content-Disposition header 中提取文件名的 javascript 正则表达式

c# - 比较 dd-MMM-yyyy 格式日期的验证