2016-10-14 2 views
0

Ich versuche, die Zeichenkette unten in 3 Gruppen zu teilen, aber damit scheint nicht zu funktionieren, wie erwartet mit dem Muster, das ich verwende. Nämlich, wenn ich matcher.group(3) aufrufen, bekomme ich einen Null-Wert statt *;+g.3gpp.cs-voice;require. Was stimmt nicht mit dem Muster?Java Regex Mustergruppe erfassen

String: "*;+g.oma.sip-im;explicit,*;+g.3gpp.cs-voice;require"

Muster: (\\*;.*)?(\\*;.*?\\+g.oma.sip-im.*?)(,\\*;.*)?

Erwartet:

Gruppe 1: null, Gruppe 2: *;+g.oma.sip-im;explicit, Gruppe 3: ,*;+g.3gpp.cs-voice;require

Actual:

Gruppe 1: null, Gruppe 2: *;+g.oma.sip-im, Gruppe 3: null

+1

Warum bist du nicht einfach auf '' 'spalten? – TheLostMind

+1

@TheLostMind: Weil es zu falschen/unerwarteten Ergebnissen führen würde. –

+0

Könnte einfach '[*] [^, *] +' verwenden und die Übereinstimmungen erhalten? – LukStorms

Antwort

0

Das Ergebnis, das Sie tatsächlich Ihr Muster in einem nicht-gierigen Weg entsprechen. Group2 ist auf die kürzest mögliche Folge erweitert

*;+g.oma.sip-im 

und dann die letzte Gruppe wird am Ende wegen der Fragezeichen weggelassen. Es scheint mir, dass Sie einen viel zu komplizierten Regex für Ihren Zweck erstellen.

0

Die Sache ist, dass die (,\*;.*)? nicht übereinstimmt, da der Text, den Sie erwarten, weiter in der Zeichenfolge befindet. Sie benötigen die dritte Gruppe obligatorisch durch Entfernen des ? am Ende zu machen, aber die ganze .*? + Gruppe 3 im Rahmen einer fakultativen nicht-einfangende Gruppe wickeln:

String pat = "(\\*;.*)?(\\*;.*?\\+g\\.oma\\.sip-im)(?:.*?(,\\*;.*))?"; 

die regex demo See.

Beachten Sie, dass literale Punkte im Regex-Muster maskiert werden sollten.

Einzelheiten:

  • (\\*;.*)? - Gruppe 1 (optional) Erfassung
    • \\*; - eine *; String
    • .* - jede null oder mehr Zeichen außer Zeilenumbrüche Symbole, so viele wie möglich
  • (\\*;.*?\\+g\\.oma\\.sip-im) - Gruppe 2 (obligatorisch) Einfangen
    • \\*; - a *; Zeichenfolge
    • .*? - jede null oder mehr Zeichen anders als Zeilenumbruch-Symbole, so wenig wie möglich
    • \\+g\\.oma\\.sip-im - eine Zeichenkette +g.oma.sip-im
  • (?:.*?(,\\*;.*))? - nicht erfassende Gruppe (optional) passend
    • .*? - alle null oder mehr Zeichen außer Zeilenumbrüche Symbole, so wenig wie möglich
    • (,\\*;.*) - Gruppe 3 (obligatorisch) das gleiche Muster wie in der Gruppe Erfassung 1.