需要帮助来构建正则表达式

时间:2019-05-02 12:46:33

标签: regex

我正在尝试为以下各行找到一个正则表达式(请参阅文章底部的尝试)

CLog_DMT_HPCC2_IWHT91731695_242_AFT1_2019-05-02T07.51.43

此行的正则表达式工作正常,以上行的结果是:

  • programName = CLog
  • otherRegex = DMT_HPCC2
  • SerialNO = IWHT91731695(注意:序列号始终以“ I”开头)
  • 版本= 242
  • operation = AFT1

这是理想的结果

但是正则表达式不适用于此行

CLOB_ABCD_6KW_SYSTEM_609-784_IWHT91831863_197_ACB_01_2019-05-02T07.03.27

我要按以下方式获得结果

  • programName = CLOB
  • otherRegex = ABCD_6KW_SYSTEM_609-784
  • SerialNO = IWHT91831863
  • 版本= 197
  • operation = ACB_01

但是我得到的如下所示:

  • programName = CLOB
  • otherRegex = ABCD_6KW_SYSTEM_609-784
  • SerialNO = IWHT91831863 _197
  • 版本= ACB
  • operation = 01

我已经尝试过以下行的正则表达式:

(?<programName>[a-zA-Z0-9]+)_(?<other>.+)_(?<boardSN>I.+)_(?<entityNameProgramVersion>.+)_(?<operation>.+)_

1 个答案:

答案 0 :(得分:2)

在模式中,您使用.+,它很贪婪,并且会一直匹配到字符串的结尾。然后它将回溯以完成其余模式。在这种情况下,它将尝试回溯以适应以下所有下划线。

相反,您可以使用不匹配下划线或换行符的否定字符类[^来将匹配项限制为当前字符串,以防出现多个跟随。

对于other部分,您可以将量词设为非贪婪(?<other>.+?),以便放弃匹配,直到可以匹配_I

^(?<programName>[a-zA-Z0-9]+)_(?<other>.+?)_(?<boardSN>I[^_\n]+)_(?<entityNameProgramVersion>[^_\n]+)_(?<operation>[^\n_]+(?:_[^\n]+)?)_

说明

  • ^字符串的开头
  • (?<programName>[a-zA-Z0-9]+)_重复1次以上字符类中列出的内容
  • (?<other>.+?)_匹配任何char超过1次,除了换行符非贪婪
  • (?<boardSN>I[^_\n]+)_否定的字符类,不匹配_或换行符
  • (?<entityNameProgramVersion>[^_\n]+)_否定的字符类,不匹配_或换行符
  • (?<operation>[^\n_]+(?:_[^\n]+)?)_否定的字符类,不与_或换行符与可选组匹配,该可选组将匹配一个下划线且不匹配下划线。之后,在组外匹配一个下划线。

Regex demo

如果末尾的可选组只能是数字,则可以使用此部分而没有最后一个下划线:

(?<operation>[^\n_]+(?:_\d+)?)

Regex demo