2017-08-11 30 views
2

給出一個包含有100000+日誌消息像一個文件長字符串:記事本++的正則表達式:尋找其中可能包含換行符

2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] connectorStatus: Pending 
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context: <DataItem type="System.Availability.StateData" time="2017-08-04T01:10:59.9525690+02:00"><ManagementGroupId>{05120214-5C27-A4EE-D32B-09CB2239421C}</ManagementGroupId><Property Name="Details" VariantType="8">There are 1 messages attached 



03.08.2017 21:00:12 

Title: Mail sync issue 



User Impact: Users are unable to sync emails using Apple Mail on their Mac computers. 

</Property></DataItem> 
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context_ManagementGroupId: {05120214-5C27-A4EE-D32B-09CB2239421C} 
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context: null 
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context_HealthServiceId: 390382B5-C177-0529-DDC0-F2969F667E49 

每個日誌消息上的時間戳開頭的新行開始。但是一些日誌消息延伸到多行;在上面的例子中看到包含第二行的「上下文」,然後與多個嵌入一些換行符任意XML。因此,在上例中恰好有5條日誌消息。

我正在尋找這是非常長的,說超過15000個字的日誌信息。

我可以通過使用記事本+ +搜索出該模式的所有相關日誌消息步驟(選項「匹配換行符。」選擇):

context:(.+?)2017-0\d-\d\dT\d\d:\d\d:\d\d:

但我未能延續,它會給我只有很長的。

我預計,以下可以工作,但沒有運氣(它選擇整個文件):

context:(.+?){15000,}2017-0\d-\d\dT\d\d:\d\d:\d\d:


如果這是不可能的記事本+ +,我也願意用其他工具,包括Linux機器上的命令行。


沒有必要的,但如果很容易可行:
搜索相同的東西我已經解釋和更換整個XML字符串的長度(字符數)。

+1

嘗試'方面:(:(?2017-0 \ D- \ d \的dT \ d \ d:\ d \ d:\ d \ d :)) {350}'和'調整到350'您門檻。 –

+0

Wiktor的,你是一個天才:-)也許你能解釋一下這是如何工作? – mez79

+0

我添加了一個答案有一點的解釋。 –

回答

3

您可以使用

(?s)context:(?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,} 

說明

  • (?s) - DOTALL模式ON(同.匹配換行符啓用)
  • context: - 文字串
  • (?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,} - 350次或更多次出現({350,})任何字符(.)不啓動2017-0\d-\d\dT\d\d:\d\d:\d\d:子模式的序列組成。

(?:(?!).)*是所謂的greedy tempered token

根據您的看法調整限制量詞最小閾值。 (?S)

enter image description here

相關問題