有(太多?)许多情况的正则表达式

Regular Expression with (too?) many cases

几个小时以来,我一直在与正则表达式作斗争,似乎没有找到最后一点解决方案。我基本上是逐行解析 C 头文件以查找变量。

以下我可能遇到的需要通过 Regex 的行的可能情况:

//#define variable_name { 300 }

#define variable_name { 300 }

//#define variable_name

#define variable_name

//#define variable_name { 300 } // Comment

#define variable_name { 300 } // Comment

#define variable_name // Comment

//#define variable_name // Comment

以下规则适用于上面的每一行:

在可选变量值或可选注释之前,我一直设法成功创建以下表达式:

/^(\/\/)?(#define)\s(\w+)\s?(.*[\/\/]?)?

这里可以测试表达式:https://regex101.com/r/krZB71/3/

我遇到的问题在第五(5)和第六(6)场比赛的第4组中可见,价值和前导评论最终被分组在一起......我的目标是单独分组 variable_name,可选值,可选前导注释

我基本上需要 \s?:

之后的部分帮助

/^(\/\/)?(#define)\s(\w+)\s? xxxxxxxxxx

非常感谢任何帮助

我发现使用下面的表达式来分隔变量和注释:

^(\/\/)?(#define)\s(\w+)\s?(.*?)(\/\/.*?)?$

您可以使模式更具体一些,并使用可选的捕获组来获取单独的值。

^(\/\/)?(#define)\s(\w+)(?:\s?({[^{}]*})?\s?(\/\/\s?(.*))?)?
  • ^ 字符串开头
  • (\/\/)?可选第1组,匹配//
  • (#define)\s 捕获组 2,匹配 #define 和空白字符
  • (\w+) 捕获 组 3 匹配 1+ 个单词字符
  • (?:非捕获组
    • \s? 匹配可选的空白字符
    • ( 可选捕获 组 4
      • {[^{}]*} 匹配 {...}
    • )? 关闭第 4 组并将其设为可选
    • \s? 匹配可选的空白字符
    • ( 可选捕获 第 5 组
      • \/\/\s? 匹配 // 然后可选的空白字符
      • (.*) 捕获 组 6 匹配除换行符之外的任何字符
    • )? 关闭第 5 组并将其设为可选
  • )? 关闭非捕获组并使其成为可选的,因此整个最后一部分都是可选的

Regex demo

注意 \s 也匹配换行符。如果你想匹配没有换行符的空白字符,你可以匹配制表符或空格 [\t ] 或匹配除换行符之外的空白字符 [^\S\r\n].