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

问题描述 投票:0回答:1

我从几个小时前开始就在纠结一个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 历久弥新
  • 变量可以选择有一个值(例如{ 300 })。
  • 变量值(如果存在)可以是所有可能的类型(文本、数字或矢量)。
  • 一行可以有一个前导注释,可以在值之后,也可以直接在变量名之后。

我成功地创建了下面的表达式,直到使用了可选的变量值或可选的注释。

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

这个表达式可以在这里测试。https:/regex101.comrkrZB713

我的问题在第五(5)组和第六(6)组Match的第4组中可以看到,数值和前面的注释最终被归为一组......。我的目的是 分组 变量名称,可选的值,可选的前导注释。

我基本上需要帮助的部分后 \s?:

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

希望得到帮助

javascript java php regex regular-language
1个回答
2
投票

我发现用下面的表达式可以把变量和注释分开。

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

0
投票

你可以把模式写得更具体一点,并使用可选的捕获组来获得分离的值。

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

Regex演示

\s 也匹配换行符。如果你想匹配空白字符而不使用换行符,你可以匹配制表符或空格。[\t ] 或匹配除换行符以外的空白字符。[^\S\r\n].

© www.soinside.com 2019 - 2024. All rights reserved.