[英]Matching characters (inc. newlines) in a regex until next match is found
我正在嘗試使用正則表達式解析日志文件,問題是我打開SingleLine模式以便我可以包含多行錯誤,然后未來的匹配包含在第一個匹配中而不是它們自己的匹配中。
為了更好地解釋,這是一個日志文件的示例:
錯誤16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
錯誤16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
測試
錯誤16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
錯誤16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
INFO 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
測試2
錯誤16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
錯誤16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
我使用以下正則表達式:
.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+
這會正確匹配每一行,但不包括已運行到新行的消息部分。 但是當我打開單線模式時,只有一個匹配(第一個),所有其他條目都包含在其中。
誰能指出我正確的方向?
謝謝 :)
基本上這個解決方案背后的想法是告訴你的正則表達式不是要包括什么但是停止在哪里 。
這個正則表達式使用正向前瞻來在你的正則表達式的下一次出現時(或在整個字符串的末尾)非常地停止
.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+?
(?=(.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})|\z)
這還包括INFO行作為上一個錯誤消息的一部分。 這聽起來有點兒麻煩,所以,如果您想將INFO行視為單個錯誤消息(不是前一個消息的一部分),您可以考慮使用此正則表達式代替
.{4,5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+?
(?=.{4,5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})
從您的示例文本文件看起來可能有一些空行。 如果沒關系,你應該可以使用這個正則表達式:
^(?:ERROR) \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - (?:(?!ERROR|INFO)(?:[a-z0-9A-Z ,:\-\t]*)\n)+
如果只是一個錯誤並且不想要空白行,請將last +
替換為*
:
^(?:ERROR) \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - (?:(?!ERROR|INFO)(?:[a-z0-9A-Z ,:\-\t]*)\n)*
這與INFO
行不匹配,但您寫道您只想要錯誤。 如果還有其他一些消息格式(例如WARNING
),則必須將它們包含在此部分中:( (?!ERROR|INFO)
由於你的正則表達式中沒有匹配的組,我使用了(?:...)
非匹配變體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.