用于回车线的正则表达式

时间:2018-08-08 05:34:48

标签: regex

我正在尝试为日志编写一个正则表达式,该日志似乎对日志条目而言运行良好,但是在某些日志条目中有回车符,导致下一行无法提取

([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 1extra 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?(.*)

2 个答案:

答案 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]*作为替代。

Demo