正则表达式:时间戳+日志信息

时间:2018-02-21 16:33:41

标签: ruby

我想匹配(时间戳+日志级别信息)

示例:

2018-02-21 17:06:00,011 DEBUG  [example]loremipsum
2018-02-21  17:06:00,011 DEBUG [example]  loremipsum 
2018-02-21 17:06:00,011   DEBUG  [example]  loremipsum 

使用:

\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}[,.]\d{3}\s?[a-zA-Z]{4,10}

问题是我不知道是否正确,因为如果在loglevel info(DEBUG)之后有两个以上的空格或标签,我有时会有0个匹配。

由于

2 个答案:

答案 0 :(得分:1)

让我们稍微阅读一下(使用你提供的正则表达式)

date_regex = /\d{4}-\d{2}-\d{2}/
time_regex = /\d{2}:\d{2}:\d{2}[,.]\d{3}/
log_level_regex = /[a-zA-Z]{4,10}/
regex = /#{date_regex}\s#{time_regex}\s?#{log_level_regex}/

正则表达式中的错误是量词的错误使用。您正在使用\s(正好为1个空格)和\s?(1或0个空格)。

您想要使用\s+(1个或更多个空格)或\s*(0个或更多个空格)。

这将导致:

/#{date_regex}\s+#{time_regex}\s*#{log_level_regex}/
# or if you prefer the not so readable version:
/\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}[,.]\d{3}\s*[a-zA-Z]{4,10}/

我建议你看看regex cheat sheet quantifiers section

答案 1 :(得分:0)

log.split($/).map { |line| line[/\A.*?(?=\[)/].strip }
#⇒ ["2018-02-21 17:06:00,011 DEBUG",
#   "2018-02-21  17:06:00,011 DEBUG",
#   "2018-02-21 17:06:00,011   DEBUG"]