我正在尝试为以下各行找到一个正则表达式(请参阅文章底部的尝试)
CLog_DMT_HPCC2_IWHT91731695_242_AFT1_2019-05-02T07.51.43
此行的正则表达式工作正常,以上行的结果是:
这是理想的结果
但是正则表达式不适用于此行
CLOB_ABCD_6KW_SYSTEM_609-784_IWHT91831863_197_ACB_01_2019-05-02T07.03.27
我要按以下方式获得结果
但是我得到的如下所示:
我已经尝试过以下行的正则表达式:
(?<programName>[a-zA-Z0-9]+)_(?<other>.+)_(?<boardSN>I.+)_(?<entityNameProgramVersion>.+)_(?<operation>.+)_
答案 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]+)?)_
否定的字符类,不与_
或换行符与可选组匹配,该可选组将匹配一个下划线且不匹配下划线。之后,在组外匹配一个下划线。如果末尾的可选组只能是数字,则可以使用此部分而没有最后一个下划线:
(?<operation>[^\n_]+(?:_\d+)?)