2017-07-26 5 views
2

Ich bin kein großer Experte in Regexp, deshalb bitte ich Sie vorschlagen, eine effiziente Möglichkeit, diese Zeichenfolge in den Schlüssel = Wert Gruppen zu teilen.Teilen der Zeichenfolge in Schlüssel = Wert Gruppen mit Regex (Java)

Die Eingabestring:

x-x="11111" y-y="John-Doe 23" db {rty='Y453'} code {codeDate='2000-03-01T00:00:00'} 

Was ich brauche, ist der Schlüssel-Wert-Paare zu erhalten:

key=x-x, value="11111" 
key=y-y, value="John-Doe 23" 
key=rty, value='Y453' 
key=codeDate, value='2000-03-01T00:00:00' 

Meine Lösung ist hier, aber ich fürchte, es ist nicht die einfachste.

String str = "x-x=\"11111\" y-y=\"John-Doe 23\" db {rty='Y453'} code {codeDate='2000-03-01T00:00:00'}"; 
Matcher m = Pattern.compile("(\\w+-*\\w*)=((\"|')(\\w+(|-|:)*)+(\"|'))").matcher(str); 

while(m.find()) { 
    String key = m.group(1); 
    String value = m.group(2); 
    System.out.printf("key=%s, value=%s\n", key, value); 
} 

Vielen Dank im Voraus für Ihre Hilfe.

+0

Sie die Tasten bestehen immer aus Buchstaben/Ziffern, '_' und' -' Zeichen? –

+0

Schlüssel haben feste Namen: 'x-x', 'y-y', 'rty' und 'codeDate'. Aber im Wert kann ziemlich alles sein .. – ayscha

Antwort

3

Sie diese Regex mit 3 einfangenden Gruppen und eine Back-Referenz verwenden können:

([\w-]+)=((['"]).*?\3) 

RegEx Demo

RegEx Breakup: 
  • ([\w-]+): Spiel und erfassen Schlüsselnamen in der Gruppe # 1
  • =: Übereinstimmung =
  • (: Gruppe 2 starten #
    • (['"]): Spiel und fängt ein Angebot in Gruppe # 3
    • .*?: Spiel 0 oder mehr beliebigen Zeichen (Lazy-Match)
    • \3: # Zurück Verweis auf Gruppe 3 Schließen Zitat von gleichem Typ entsprechen
  • ): Ende der Capture-Gruppe # 2

Sie erhalten Ihre Spiele in .group(1) und .group(2).

+1

Gibt es nicht tatsächlich drei einfangende Gruppen in der Regex? –

+0

Ja, es gibt drei :) – anubhava

+0

Vielen Dank für Ihre Antwort. Jetzt habe ich meine Fehler und die Komplexität der Lösung erkannt. :) Eigentlich als Alternative kann diese Lösung verwendet werden ([\ w -] +) = ((['"]). *? (['"])) – ayscha

0

Für ausgewählte Werte zwischen einfachen und doppelten Anführungszeichen Wert in Gruppe 1

String ResultString = null; 
try { 
    Pattern regex = Pattern.compile("[\"'](.*?[^\\\\])[\"']", Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    if (regexMatcher.find()) { 
     ResultString = regexMatcher.group(1); 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 
Verwandte Themen