我从几个小时前开始就在纠结一个Regex,似乎没有找到最后一点解决方法。我基本上是在逐行解析一个C-Header文件来寻找变量。
以下是我可能遇到的需要通过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 variable_name
历久弥新我成功地创建了下面的表达式,直到使用了可选的变量值或可选的注释。
/^(\/\/)?(#define)\s(\w+)\s?(.*[\/\/]?)?
这个表达式可以在这里测试。https:/regex101.comrkrZB713
我的问题在第五(5)组和第六(6)组Match的第4组中可以看到,数值和前面的注释最终被归为一组......。我的目的是 分组 变量名称,可选的值,可选的前导注释。
我基本上需要帮助的部分后 \s?
:
/^(\/\/)?(#define)\s(\w+)\s? xxxxxxxxxx
希望得到帮助
我发现用下面的表达式可以把变量和注释分开。
^(\/\/)?(#define)\s(\w+)\s?(.*?)(\/\/.*?)?$
你可以把模式写得更具体一点,并使用可选的捕获组来获得分离的值。
^(\/\/)?(#define)\s(\w+)(?:\s?({[^{}]*})?\s?(\/\/\s?(.*))?)?
^
字符串的开始(\/\/)?
可选 第1组匹配 //
(#define)\s
捕获第2组,匹配 #define
和空白字符(\w+)
捕捉 第三组 匹配1+单词字符(?:
非捕获组\s?
匹配可选的空白字符(
可选捕获 第4组{[^{}]*}
匹配 {
...}
)?
关闭第4组,并使其成为任择组。\s?
匹配可选的空白字符(
可选捕获 第五组\/\/\s?
匹配 //
然后可选的空白字符(.*)
捕捉 第六组 匹配除换行符以外的任何字符)?
关闭第5组并使其成为可选择的。)?
关闭非捕获组,并使其成为可选的,因此整个最后部分是可选的。注 该 \s
也匹配换行符。如果你想匹配空白字符而不使用换行符,你可以匹配制表符或空格。[\t ]
或匹配除换行符以外的空白字符。[^\S\r\n]
.