可能不存在的正则表达式捕获组

时间:2017-09-08 09:12:42

标签: regex logfile capturing-group

我通过一些日志文件运行正则表达式。 捕获组应捕获一些相关字段。 我想知道日志文件是否提到了作业的成功结束。这可以通过字符串的存在与否来结束"作业成功执行"

到目前为止我的正则表达式: ^Job started at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+orderno\s+-\s+'(\w+)'\s+runno\s+-\s+'(\d+)'[\s\S]+Host1\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)' - Host2\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)'[\s\S]+(Job executed successfully)?[\s\S]+Job ended at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+Elapsed time\s\[([\d.]+)sec\]\sCPU usage\s\[([\d.]+)sec]

(我是正则表达式的新手,所以它根本不是完美的,需要一些强化)

成功结束的示例日志: 上面的正则表达式只有在问号背后"(作业成功执行)?"在我看来,这是不必要的。

  

工作开始于' 0902 23:56:00:367' orderno - ' 0tzh0' runno - ' 00064'     转账数量 - 1

     

主机1'本地' [Windows-LOCAL]用户名' xxx \ xxx' - Host2' xxx.xxx.xx' [Unix-SFTP]用户名' xxx'

     

本地主机是:xxx - Windows 200x [601] Service Pack 1 build 7601 - Intel64 Family 6 Model 37 Stepping 1,GenuineIntel

     

**********从1开始转移#1 ***************     转移#1已成功完成

     

作业成功执行。离开。

     

工作在' 0902 23:56:07:138'     经过时间[7秒] CPU使用率[0.15秒]

结尾不成功的示例日志: 上面的正则表达式就像应该的那样。

  

工作开始于' 0831 15:26:00:365' orderno - ' 0tuq5' runno - ' 00030'     转账数量 - 4

     

主机1'本地' [Windows-LOCAL]用户名' xxx \ xxx' - Host2' xxx.xxx.xx' [Unix-SFTP]用户名' xxx'

     

本地主机是:xxx - Windows 200x [601] Service Pack 1 build 7601 - Intel64 Family 6 Model 37 Stepping 1,GenuineIntel

     

**********从4开始转移#1 ***************     无法连接到' xxx.xxx.xx上的SSH服务器':SFTP_Connect:psftp_connect失败:ssh_init:网络错误:连接超时   

     

无法建立与主机sftp.onenet.be的连接

     

工作在' 0831 15:26:21:426'

结束      

经过时间[21秒] CPU使用率[0.0秒]

2 个答案:

答案 0 :(得分:0)

如果你正在使用PCRE,你可以使用神话般的\Q...\E序列和neg。先行:

^\QJob started\E
(?:(?!\QJob ended\E).)+?
^\QJob executed successfully\E

请参阅a demo on regex101.com(并注意multilineverbosesingleline修饰符!)。

如果没有,整个表达式有点难以理解:

^Job started(?:(?!Job ended).)+?^Job executed successfully

答案 1 :(得分:0)

对正则表达式进行最小的更改,您可以使用以下内容:

^Job started at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+orderno\s+-\s+'(\w+)'\s+runno\s+-\s+'(\d+)'[\s\S]+?Host1\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)' - Host2\s'([\w.]+)'\[([\w-]+?)\] username '([\w\\]+)'[\s\S]+?(?:(Job executed successfully)[\s\S]+?)?Job ended at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+Elapsed time\s\[([\d.]+)sec\]\sCPU usage\s\[([\d.]+)sec]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^^^-----------------------------------^^

(上面^指示的主要变化)

我还将一些量词转换为懒惰,这会使事情变得更快。

regex101 demo

由于[\s\S]+和回溯(从右到左)的贪婪匹配和(Job executed successfully)?[\s\S]+的测试,您当前的正则表达式会匹配所有内容直到最后,并且[\s\S]+将匹配为找到Job ended后即可。

以上述方式,我们从左到右检查每个字符,直到我们到达我们需要的部分,即Job executed successfully(如果存在)。