2016-05-03 12 views
0

Ich analysiere IBM JVM Thread Dumps, um verschiedene Informationen zu extrahieren. Im aktuellen Kontext die Lock-ID, auf der der Thread wartet, und die ID des Threads, der diese Sperre besitzt. Die Lock-ID ist für alle Dumps konsistent und hat die Form des Hexadezimalwerts 0x000000000B0D9A20. Aber die ID des Thread-Haltesperre nimmt andere Werte an wie die Hex-ID des gleichen Forms wie die Lock-ID oder etwas wie <unknown> oder <unowned>. Es ist die ID des Schließbesitzers, die ich schwer zu extrahieren finde.Kombinieren von zwei Gruppen zu einer in Regex

IBM Thread-Dump gibt Lock-Info mit drei Klauseln (wie Sie in erster Screenshot sehen):

  1. Waiting on...
  2. Blocked on...
  3. Parked on...

Ich Durchführung ODER-Verknüpfung diese Klauseln in Regex.

Ich habe eine generische Methode geschrieben, die

  1. Thread-Dump Linie
  2. regex akzeptiert
  3. Anzahl der Gruppen gelten, in einer Liste

Zum Beispiel zurückzukehren, um den Anruf method1(threadDumpLine,regex,2) wird Wenden Sie regex auf threadDumpLine an und geben Sie die Liste [group1,group2] zurück, wobei group1 eine erste Gruppe ist, die währenderfasst wurdeist der zweite.

Die erste Gruppe muss die Lock-ID sein, die ich erfassen kann, aber die zweite Gruppe kann entweder Hex ID oder <unknown> oder <unowned> sein. Ich bin in der Lage Sperre Besitzers ID als zweite Gruppe zu erfassen, aber wenn es <unowned> oder <unknown> ist dann stellt sich heraus dritte Gruppe sein:

enter image description here (oben auf regex101)

, was geschieht, weil ich zwei definiert separate Gruppen zum Erfassen der ID des Schließbesitzers und <text>. Also habe ich versucht, die beiden in einem zu kombinieren, wie folgt:

enter image description here (oben auf regex101)

Wie kann ich die Regex ändern oben mit möglichst wenig Schritte wie angegeben zu erfassen?

+0

Es wäre schön, einen Blick haben auf alle Daten dort verursachen Ausnahmen geben könnte, aber hier ist ein Vorschlag '(?: Blockierte auf | Geparkt auf | Warten auf): [^ @] * @ (0x [0-9A-F] *) Gehört zu:. *? (<[^>] +> | 0x [0-9A-F] *). * ' –

+0

Hinweis: Die' ' on'' Text könnte außerhalb des '(?: ...)' like '(?: Blocked | Geparkt | Waiting) auf ' –

Antwort

0
diese

Versuchen:

(?:Blocked on|Parked on|Waiting on):[^@]*@(0x[0-9A-F]+) Owned by:[^<\n]*?(0x[0-9A-F]+|<.*?>) 

Ausgabe:

MATCH 1 
    > 1. [69-87]  `0x000000000B0D9A20` 
    > 2. [130-148] `0x00000000846F4900` 
MATCH 2 
    > 1. [288-306] `0x000000000296F1E8` 
    > 2. [317-326] `<unknown>` 
MATCH 3 
    > 1. [466-484] `0x0000000030A0C590` 
    > 2. [495-504] `<unowned>` 

demo

+0

liegen, das ist sehr präzise ... danke – Mahesha999

0

können Sie diese Negation verwenden basierte regex das Recht erfassten Gruppe # 2 zu erhalten:

(?:Blocked on|Parked on|Waiting on):[^@]*@(0x[0-9A-F]+) Owned by:[^<\n]*(0x[0-9]+|[^>\n]+) 

RegEx Demo

Dies gibt folgende Spieldaten:

MATCH 1 
1. [69-87] `0x000000000B0D9A20` 
2. [185-186] `)` 

MATCH 2 
1. [288-306] `0x000000000296F1E8` 
2. [317-325] `<unknown` 

MATCH 3 
1. [466-484] `0x0000000030A0C590` 
2. [495-503] `<unowned`