有(太多?)许多情况的正则表达式
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 variable_name
会一直存在
- 一个变量可以有一个可选的值(例如 { 300 })
- 变量值(如果存在)可以是所有可能的类型(文本、数字或矢量)
- 一行可以有前导注释,可以在值之后或直接在 variable_name
之后
在可选变量值或可选注释之前,我一直设法成功创建以下表达式:
/^(\/\/)?(#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 组并将其设为可选
)?
关闭非捕获组并使其成为可选的,因此整个最后一部分都是可选的
注意 \s
也匹配换行符。如果你想匹配没有换行符的空白字符,你可以匹配制表符或空格 [\t ]
或匹配除换行符之外的空白字符 [^\S\r\n]
.
几个小时以来,我一直在与正则表达式作斗争,似乎没有找到最后一点解决方案。我基本上是逐行解析 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 variable_name
会一直存在- 一个变量可以有一个可选的值(例如 { 300 })
- 变量值(如果存在)可以是所有可能的类型(文本、数字或矢量)
- 一行可以有前导注释,可以在值之后或直接在 variable_name 之后
在可选变量值或可选注释之前,我一直设法成功创建以下表达式:
/^(\/\/)?(#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 组并将其设为可选
)?
关闭非捕获组并使其成为可选的,因此整个最后一部分都是可选的
注意 \s
也匹配换行符。如果你想匹配没有换行符的空白字符,你可以匹配制表符或空格 [\t ]
或匹配除换行符之外的空白字符 [^\S\r\n]
.