2017-04-05 1 views
-1

Ich habe eine Zeichenfolge in Java wie:Wie kann man Schlüssel/Wert in Graph-Klammern mit Regex in Java erfassen?

String whatIHaveToMatch = "$item1$={key1=1,key2=2,key3=3,}"+ 
          "$item2$={key10=4,key11=5,key3=4,key9=7,}"+ 
          "$itemN$={keyi-1=5,keyi=3,}"; 

wie kann ich ein Muster definieren zugeordnet alle Gruppen, die jeweils von ihnen enthält Artikel und alle Schlüssel/Wert zu bekommen?

UPDATE:

Ich habe ein HashMap<String,HashMap<String,Integer>> , in dem jeder entryKey externen HashMap zu bauen, ist eine Kennung eines Elements und gibt die Karte des internen „Schlüssels“/„Wert“.

Die "Schlüssel" (in diesem Beispiel: key1, key2, key3 ...) haben keine spezielle Form, sie können alphanumerisch sein, wie es passiert.

+0

Welche Art von Java-Objekt möchten Sie ausgeben? – horcrux

+0

HashMap > –

+0

Können Sie die erwartete Ausgabe für die Eingabe hinzufügen, die Sie angegeben haben? Wird deine Saite immer so sein? (alle Schlüssel beginnen mit dem Wort "Schlüssel" und dann eine Nummer?) – jrook

Antwort

1

Dies macht die Arbeit mit regulären Ausdrücken:

String string = "$item1$={key1=1,key2=2,key3=3,}"+ 
        "$item2$={key10=4,key11=5,key3=4,key9=7,}"+ 
        "$itemN$={keyi-1=5,keyi=3,}"; 
HashMap<String,HashMap<String,Integer>> myMap = new HashMap<String,HashMap<String,Integer>>(); 
Pattern itemPattern = Pattern.compile("([^\\s{}]+)=\\{([^{}]+)\\}"); 
Matcher itemMatcher = itemPattern.matcher(string); 
while(itemMatcher.find()) { 
    HashMap<String,Integer> item = new HashMap<String,Integer>(); 
    String itemName = itemMatcher.group(1); 
    String itemContent = itemMatcher.group(2); 
    Pattern kvPattern = Pattern.compile("([^=,]+)=([^=,]+)"); 
    Matcher kvMatcher = kvPattern.matcher(itemContent); 
    while(kvMatcher.find()) { 
     item.put(kvMatcher.group(1), Integer.parseInt(kvMatcher.group(2))); 
    } 
    myMap.put(itemName, item); 
} 
System.out.println(myMap.toString()); 

aber sehr vorsichtig sein. Wie Kimbert sagte, sind Regexps nicht das richtige Werkzeug für diese Art von Arbeit.

+0

Sie haben Recht! Aber es funktioniert! Ja! Vielen Dank! –

1

Ein regulärer Ausdruck ist das falsche Werkzeug dafür. Sie benötigen einen einfachen Parser. Wenn dies das einzige Datenformat ist, das Sie analysieren müssen, können Sie einen benutzerdefinierten Code schreiben, um die Zeichenfolge zu analysieren. Wenn Sie eine Reihe von Formaten parsen müssen, dann könnte etwas wie JavaCC oder Antlr besser sein.

Verwandte Themen