【问题标题】:Regular Expression with (too?) many cases正则表达式(太多?)很多情况
【发布时间】: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


【解决方案1】:

我发现使用以下表达式将变量和注释分开:

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

【讨论】:

  • 非常纤薄且有效的解决方案,谢谢。我注意到虽然在某些情况下我最终会得到空组,但必须在我的代码中进行检查
  • 这不是您想要的吗?现在您可以依赖第 4 组作为值,而不是“有时是变量,有时是评论”?也许我没有看到你的用例,但这就是我想要的。
  • 我又添加了一个问号,它现在就像一个魅力,没有空组:^(\/\/)?(#define)\s(\w+)\s?(.*?)?(\/\/.*?)?$
  • 太棒了!很高兴我能帮上忙!
  • 您关于第 4 组始终是值的观点实际上不仅有效,而且最终简化了编码部分。谢谢你
【解决方案2】:

您可以使模式更加指定并使用可选的捕获组来获取单独的值。

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

Regex demo

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

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2011-07-31
    • 2014-10-06
    • 2021-11-14
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2016-05-15
    相关资源
    最近更新 更多