我正在尝试为日志编写一个正则表达式,该日志似乎对日志条目而言运行良好,但是在某些日志条目中有回车符,导致下一行无法提取
([0-9]{2}\s[A-Za-z]{3}\s[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}(?:,[0-9]{3})?)\s?(.*)
正则表达式上方对没有多余回车符的行很好用
01 Jan 2018 04:25:56,546 [TEXT] aabb33-ddee33-54321 (host-1-usa-east) this.is.sample.log: service is responding normal
02 Jan 2018 05:25:56,546 [TEXT] aabb33-ddee33-54321 (host-1-usa-east) this.is.sample.log: service is responding normal
但是当其中几行添加回车符时,这无法拾取extra line 1
和extra line 2
01 Jan 2018 04:25:56,546 [TEXT] aabb33-ddee33-54321 (host-1-usa-east) this.is.sample.log: service is responding normal
02 Jan 2018 05:25:56,546 [TEXT] aabb33-ddee33-54321 (host-1-usa-east) this.is.sample.log: service is responding normal
extra line 1
extra line 2
03 Jan 2018 08:25:56,546 [TEXT] aabb33-ddee33-54321 (host-1-usa-east) this.is.sample.log: service is responding normal
我什至尝试添加^来匹配开始,但这只选择了第一个日志条目
^([0-9]{2}\s[A-Za-z]{3}\s[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}(?:,[0-9]{3})?)\s?(.*)
答案 0 :(得分:1)
您可以使用
(?<=\n|^)(\d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2}(?:,\d{3})?)\s?(.*?)(?=$|\n\d{2} [A-Za-z]{3} \d{4})
^^^^^^^^^ ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
重要的部分是在日期末尾或字符串末尾的前瞻。另外,请确保延迟重复.
。 \n
或^
的开头也位于后面,而不是 m 标志,因此$
的结尾处的前瞻仅与结尾处的匹配。字符串,而不仅仅是一行的结尾。
https://regex101.com/r/YAkWBe/1
还请记住,您可以将[0-9]
简化为\d
。
如果您不能使用s
标志(允许点匹配换行符),则不要重复点以捕获日期之后的(可能是多行)字符串,而应使用[\s\S]
,它将捕获所有内容(所有非空白字符,和所有空白字符->所有内容):
([\s\S]*?)
答案 1 :(得分:0)
除了可以捕获文件中最后一个日志条目之外,我可以提供以下功能良好的正则表达式:
([0-9]{2}\s[A-Za-z]{3}\s[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}(?:,[0-9]{3})?)\s?(.*?)(?=[0-9]{2}\s[A-Za-z]{3}\s[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}(?:,[0-9]{3}))
长话短说,我在(.*)
之后的模式末尾添加了一个前行,当遇到下一个日志条目的开始时,它会暂停。然后,唯一的其他更改是使用(.*?)
,即使点变得懒惰,以使其在前行暂停。
此外,此正则表达式应以点所有模式运行,其中.*
将跨行匹配。如果没有显式可用的点所有模式,则可以使用[\s\S]*
作为替代。