簡體   English   中英

正則表達式,用於回車線

[英]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 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?(.*)

你可能會用

(?<=\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM