[英]regex for carriage return lines
我正在尝试为日志编写一个正则表达式,似乎对日志条目而言工作正常,但是在某些日志条目中有回车符,然后无法提取下一行
([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?(.*)
你可能会用
(?<=\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]*?)
我可以提供以下正常运行的正则表达式,除了它不能捕获文件中的最后一个日志条目外:
([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]*
作为替代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.