[英]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.