Regex严格匹配两行具有不同结尾的行。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

我正在尝试匹配日志文件的以下文本:

2019-05-22 03:40:01 INFO  ReporteClaro:194 - Termino de procesar archivo

2019-05-22 03:40:01 INFO  ReporteClaro:208 - Termino de procesar Transaction Report

除了end(archivo)和(Payment Report)之外,它包含相同的单词。

我试过这个:

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar (archivo|Transaction Report)

但是由于|操作员的缘故,这是可选的匹配。这意味着它将匹配第一行或第二行,但我严格需要正则表达式来匹配它们。我认为这样的事情但显然不会运行:

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar (archivo&Transaction Report)

PD:我尝试过使用\ n的另一种解决方案,但有没有办法在不重复的情况下实现相同的结果?:

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar archivo\n

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar Transaction Report
提问于
用户回答回答于

如果“terivo”和“交易报告”是您在“Termino de procesar”之后所期望的唯一值,即没有像“Termino de procesar Something Else”那样的东西。您可以简单地执行以下操作。

r"^.+Termino de procesar.+$"gm

演示

实际上,只有当它们有“Termino de procesar”这个短语时,它才能从行的开始到结束。

如果其他日志条目中包含“Termino de procesar”,而您不想要的则可以使用以下内容。

r"^.+Termino de procesar archivo.*$|^.+Termino de procesar Transaction Report.*$"gm

DEMO2

我觉得简单通常是最好的解决方案。无需明确选择日期时间内的东西,或者“ReporteClaro”只需使用之前的catch来抓取它。更容易理解正则表达式imo。

编辑:您需要gm修改器,除非您逐行阅读。

用户回答回答于

这将使他们成为一个整体,以及介于两者之间的一切。

(?s)[\d]+-[\d]+-[\d]+[ ][\d]+:[\d]+:[\d]+[ ]INFO[ ]ReporteClaro:[\d]+[ ]-[ ]Termino[ ]de[ ]procesar[ ](?:archivo|Transaction[ ]Report)(?:.*?[\d]+-[\d]+-[\d]+[ ][\d]+:[\d]+:[\d]+[ ]INFO[ ]ReporteClaro:[\d]+[ ]-[ ]Termino[ ]de[ ]procesar[ ](?:archivo|Transaction[ ]Report))*  

可读版

 (?s)

 [\d]+ - [\d]+ - [\d]+ [ ] [\d]+ : [\d]+ : [\d]+ [ ] INFO [ ] ReporteClaro: 
 [\d]+ [ ] - [ ] Termino [ ] de [ ] procesar [ ] 
 (?: archivo | Transaction [ ] Report )

 (?:
      .*? [\d]+ - [\d]+ - [\d]+ [ ] [\d]+ : [\d]+ : [\d]+ [ ] INFO [ ] ReporteClaro: 
      [\d]+ [ ] - [ ] Termino [ ] de [ ] procesar [ ] 
      (?: archivo | Transaction [ ] Report )
 )*

扫码关注云+社区

领取腾讯云代金券