2017-04-18 5 views
1

Ich versuche, eine Regex zu schreiben, um ein Ereignis aus einer Protokolldatei plus die Zeit, die es passierte, zu extrahieren. Leider ist die Protokolldatei nicht sehr strukturiert, da die Logger der dritten Partei Zeitstempel asynchron zu meinem geloggten Text einfügt. Ich kann von ID:00000015fd6cRegulärer Ausdruck, um ein Muster und das erste Vorkommen eines anderen Textmusters vor ihm zu finden

Ein Beispiel das Ereignis identifizieren ist:

[2017/4/16 2:28:29AM] (I) Radio mode changed to 
SYSAXRADIO_E_STATE_PAGER_RX_SYNC on 170.9 MHz 

[2017/4/16 2:28:37AM] Tock = 1718 
(I) IDTAG TAG : -90dBm : ID:00000015fd6c 
(I) *************** 
(I) ID TAG DETECTED 00000015FD6C 
(I) *************** 

Derzeit ist die regex ich habe, ist: (?<=2017)[\s\S]*?ID:00000015fd6c

Ich möchte:

[2017/4/16 2:28:37AM] Tock = 1718 
(I) IDTAG TAG : -90dBm : ID:00000015fd6c 

aber ich bekomme:

[2017/4/16 2:28:29AM] (I) Radio mode changed to 
SYSAXRADIO_E_STATE_PAGER_RX_SYNC on 170.9 MHz 

[2017/4/16 2:28:37AM] Tock = 1718 
(I) IDTAG TAG : -90dBm : ID:00000015fd6c 

Der Text, den ich möchte, ist die alles inklusive "ID: 00000015fd6c" rückwärts bis zum ersten Zeitstempel vor dem passenden Text.

Hilfe bitte?

+0

Ist 'ID' festgelegt? – Rahul

Antwort

1

Sie können eine tempered greedy token wie folgt verwenden:

\[2017\/(?:(?!\[\d{4}\/\d{1,2}\/\d)[\s\S])*?ID:00000015fd6c 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Siehe regex demo

Einzelheiten

  • \[2017\/ - eine String
  • (?:(?!\[\d{4}/\d{1,2}/\d)[\s\S])*? - ein beliebiges Symbol, 0+ occ urrences, so wenig wie möglich, dass nicht startet eine Sequenz:
    • \[ - eine wörtliche [
    • \d{4}\/\d{1,2}\/\d-4 Ziffern, /, 1 oder 2-stellig, /, eine Ziffer
  • ID:00000015fd6c - a ID:00000015fd6c string
+1

Vielen Dank. Das ist für mich in Ordnung! –

Verwandte Themen