2016-05-13 16 views
4

Wie teilt man diese Zeichenfolge in Java, so dass ich den Text zwischen den geschweiften Klammern in einem String-Array erhalten werde?Split String in Java nach spezifizierten Muster

GivenString = "(1,2,3,4,@) (a,s,3,4,5) (22,324,#$%) (123,3def,f34rf,4fe) (32)" 

String [] array = GivenString.split(""); 

Output muss sein:

array[0] = "1,2,3,4,@" 
array[1] = "a,s,3,4,5" 
array[2] = "22,324,#$%" 
array[3] = "123,3def,f34rf,4fe" 
array[4] = "32" 
+1

Verwenden Sie dieses Muster ['" \\ ((*?) \\) "'] (https://regex101.com/r/dL9yH9/1). Dann enthält "$ 1", was Sie brauchen. – Shafizadeh

Antwort

7

Sie können versuchen, zu verwenden:

Matcher mtc = Pattern.compile("\\((.*?)\\)").matcher(yourString); 
+0

[Demo] (http://ideone.com/djO439) –

+1

Verwendung: 'while (mtc.find()) {String-Übereinstimmung = mtc.group (1);/* ... * /} '. – sp00m

+0

Verwenden Sie für die Leistung statt eines widerwilligen Quantifizierers ('*?') Einen gierigen Quantifizierer, der nicht mit der Klammer übereinstimmen kann: '" \\ ((^)] *) \\) "' – Andreas

0

Normalerweise würden Sie die split() Funktion verwendet werden soll, da dies das ist einfachste Möglichkeit, einen String in mehrere Arrays aufzuteilen, wenn der String durch ein Schlüssel-Zeichen getrennt wird.

Das Hauptproblem ist, dass Sie Informationen zwischen zwei Zeichen benötigen. Der einfachste Weg, um dieses Problem zu lösen, würde durch die Zeichenfolge bekommen Fahrt von jeder Instanz von '(' gehen. Dies lässt die Zeichenfolge wie folgt aussehen

String = "1,2,3,4, @) a, s, 3,4,5) 22,324, # $%) 123,3def, f34rf, 4fe) 32) "

Und das ist perfekt, wie Sie durch den char" teilen "können und sich keine Sorgen über die andere Klammer stören mit der Spaltung. Ich schlage vor, die Ersetzung ("", "") zu verwenden, wobei jede Instanz des ersten Parameters durch den zweiten Parameter ersetzt wird (wir können "" verwenden, um sie zu löschen).

Hier ist ein Beispiel-Code, der arbeiten kann:

String a = "(1,2,3,4,@) (a,s,3,4,5) (22,324,#$%) (123,3def,f34rf,4fe) (32)" 
a = a.replace("(",""); 
//a is now equal to 1,2,3,4,@) a,s,3,4,5) 22,324,#$%) 123,3def,f34rf,4fe) 32) 
String[] parts = a.split("\\)"); 

System.out.println(parts[0]); //this will print 1,2,3,4,@ 

Ich habe es nicht vollständig getestet, so dass Sie mit unerwünschten Leerzeichen am Ende der Saiten können am Ende Sie bekommen müssen zu befreien!

Sie können dann Teile durchlaufen [] und es sollte alle erforderlichen Teile für Sie haben!

1

Die beste Lösung ist die answer by Rahul Tripathi, aber Ihre Frage sagte „Wie gespalten, wenn Sie also split() (zB ist dies eine Zuordnung) verwenden müssen, dann wird diese regex tun:

^\s*\(|\)\s*\(|\)\s*$ 

Dort heißt es:

  • Spiel die offene Klammer am Anfang
  • Spiel close-Klammer gefolgt durch offene Klammer
  • Spiel der close-Klammer am Ende

Alle 3 ermöglicht Leerzeichen.

Als Java Regex, das würde bedeuten:

str.split("^\\s*\\(|\\)\\s*\\(|\\)\\s*$") 

Siehe regex101 for demo.

Das Problem bei der Verwendung split() ist, dass die führende Open-Klammer eine Spaltung vor dem ersten Wert bewirkt, zu Beginn in einem leeren Wert resultierenden:

array[0] = "" 
array[1] = "1,2,3,4,@" 
array[2] = "a,s,3,4,5" 
array[3] = "22,324,#$%" 
array[4] = "123,3def,f34rf,4fe" 
array[5] = "32" 

Deshalb bestimmt die Antwort von Rahul ist besser, weil es wird einen solchen leeren Wert nicht sehen.