2012-04-13 18 views
0

Ich versuche, einige Informationen aus Web-Server-Log zu extrahieren und es ist nicht sehr strukturiert, damit ich in Schwierigkeiten laufen, ich versuche zu entsprechen:Matching regex für optionale Werte

Beispiel 1:

2011-11-29 11:30:23,685 DEBUG [my.fully.qualified.package.Service] Added Action Item: M= 2 Success 

Beispiel 2:

2011-11-29 11:30:23,685 DEBUG [my.fully.qualified.package.Service] Added Action Item: M=10 Success 

Diese Regex funktioniert zum Beispiel 1:

(\d\d\d\d-\d\d-\d\d)\s[\d|:]+,\d+\s([A-Z]+)\s\[(.+)\]\s.+:\sM=\s(\d).+ 

Wenn die erste Gruppe das Datum ist, ist die zweite die Protokollstufe, die dritte ist der Klassenname und die dritte ist der Wert M.

Sie haben vielleicht bemerkt, dass in Beispiel 1, nach M = gibt es ein Leerzeichen vor Ziffer und in dem anderen Beispiel gibt es nicht, deshalb ist diese Regex nicht funktioniert.

Ich habe etwas wie M=[\s|d]+ versucht, aber ich bekomme ein paar mehr Zeichen übereinstimmte, dass ich fragte, hat jeder Vorschlag, wie diese beiden Beispiele mit einem Regex übereinstimmen?

Antwort

2

Sie möchten M=\s*(\d+), die Null oder mehr Leerzeichen unmittelbar nach der =, aber keine Leerzeichen nach den Ziffern zulassen.

0
M=\s?(\d).+ 

Ermöglicht einen optionalen Leerraum nach dem =.

0

Ich glaube, Sie einige Tippfehler Fehler haben, sollte es

sein

M=[\s|\d]+