【发布时间】:2020-08-17 18:18:55
【问题描述】:
几个小时以来,我一直在努力使用正则表达式,似乎没有找到最后一点解决方案。我基本上是在逐行解析 C-Header 文件以查找变量。
按照我可能遇到的需要通过正则表达式的行的可能情况:
//#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 variable_name将永远存在 - 变量可以有一个可选的值(例如 { 300 })
- 变量值(如果存在)可以是所有可能的类型(文本、数字或矢量)
- 一行可以有一个前导注释,可以在值之后或直接在变量名之后
在可选变量值或可选注释之前,我一直在成功创建以下表达式:
/^(\/\/)?(#define)\s(\w+)\s?(.*[\/\/]?)?
表达式可以在这里测试:https://regex101.com/r/krZB71/3/
我遇到的问题在第五 (5) 和第六 (6) 比赛的第 4 组中可见,价值和主要评论最终被分组在一起......我的目标是单独分组 变量名,可选值,可选前导注释
\s?之后的部分我基本上需要帮助:
/^(\/\/)?(#define)\s(\w+)\s? xxxxxxxxxx
非常感谢任何帮助
【问题讨论】:
-
你试过这个
^(\/\/)?(#define)\s(\w+)\s?(\{.*\})?\s?(\/\/.*)?$ -
您可以在最后将某些部分设为可选,并使用可选的捕获组
^(\/\/)?(#define)\s(\w+)(?: ?({[^{}]*})? ?(\/\/ ?(.*))?)?regex101.com/r/FP3YqN/1 -
@Thefourthbird 你的解决方案非常简洁,我喜欢它甚至将主要评论与它分开 cmets slashes
-
@kapreski 你的解决方案只是有点工作。我注意到的一件事是,变量值是用大括号硬编码的,而我在上面提到它可以是任何类型。尽管如此,我还是从你的建议中学到了,谢谢!
-
@CRE8IT 我已将其添加为带有解释的答案。
标签: javascript java php regex regular-language