# Frage zu split() und dem Trennzeichen.



## Daniel_L (27. Nov 2008)

Hallo,

ich habe eine Frage, und ich vermute, sie wurde sicherlich schonmal gestellt und beantwortet. Aber die Suche blieb für mich bisher erfolglos...

Ich möchte einen String an einem bestimmten Zeichen splitten (beim Komma), allerdings möchte ich in bestimmten Fällen das Komma _nicht_ als Trennzeichen erkennen lassen.

In C++ konnte ich mit der Methode parse() ein Trennzeichen angeben, und sagen, wann dieses Trennzeichen nicht als Trennzeichen gewertet werden soll - bspw. wenn das Komma innerhalb von Anführungszeichen steht.

Beispiel:


```
String x = "\"abc, def\",huhu,hallo";
        String[] y = x.split(",");
```

Sollte für mich idealerweise drei Strings zurückliefern:
abc, def
huhu
hallo

tut es aber nicht. Es werden vier Strings geliefert, abc und def werden auch getrennt.

Wie kriege ich das hin? Ich habe leider das Gefühl, reguläre Ausdrücke in diesem Leben nicht mehr zu verstehen, weshalb ich bisher auch noch keine Idee habe, welches Argument split() erhalten muss, um das Komma als Trennzeichen zu verwenden, das aber innerhalb von "" ignoriert wird...


----------



## Ark (27. Nov 2008)

Ich habe es zwar noch nicht probiert bzw. kenne mich da jetzt nicht so aus, aber ich bezweifle, dass die Regeln für reguläre Ausdrücke ausreichen, um deinen Fall zu beschreiben. Aber für so was sollte man wohl auch besser Wildcard fragen. 

Ark


----------



## Ariol (27. Nov 2008)

Regex weiß ich auch nicht, aber das sollte helfen 



```
public static String[] splitIgnoreDoubleQuotes(String string)
	{
		ArrayList<String> splitList = new ArrayList<String>();

		for (String s1 : string.split("\","))
		{
			if (s1.trim().startsWith("\""))
			{
				splitList.add(s1.replace("\"", ""));
			}
			else
			{
				for (String s2 : s1.split(","))
				{
					splitList.add(s2);
				}
			}
		}

		return splitList.toArray(new String[splitList.size()]);
	}
```


----------



## Wildcard (27. Nov 2008)

```
String x = "\"abc, def\",huhu,\"blubb,blah\",hallo";
Matcher mat =  Pattern.compile("(\".*?\"|[^,]+),?").matcher(x);
while (mat.find()) {
	System.out.println(mat.group(1));
}
```


----------



## hdi (28. Nov 2008)

Ach, ich dachte Wildcard ist der AWT & Swing Profi, jetz isser auch noch regex-perte. Scheint, als wärste generell einer der Gurus hier was  Gut zu wissen, gleich mal aufschreiben..

_List of people to annoy when having questions:_
Marco13
Quaxli
Wildcard

Bin schon wieder weg ;


----------



## Wildcard (28. Nov 2008)

hdi hat gesagt.:
			
		

> Ach, ich dachte Wildcard ist der AWT & Swing Profi, jetz isser auch noch regex-perte.


Eigentlich habe ich schon seit ca. 3 Jahren kein AWT/Swing mehr angefasst  :wink:


----------



## Daniel_L (28. Nov 2008)

Vielen Dank erstmal für die Antworten. Der reguläre Ausdruck von WildCard klappt wunderbar.

Ich hab allerdings noch zwei ergänzende Fragen:

1) Wie kann ich nur den Text innerhalb der Anführungszeichen erhalten, die Anführungszeichen beim splitten also gleich "rauslöschen"?

2) Wenn ich den regulären Ausdruck direkt dem split()-Befehl als Parameter übergebe, funktioniert das nicht:

```
String[] arr = text.split("(\".*?\"|[^,]+),?");
```
Ich erhalte ein leeres Array, wobei hingegen die while-Schleife mit dem Matcher alles fein trennt. Nun müsste ich aber die Anzahl der Teile herausfinden, Matcher bietet aber keine eigene count-methode, oder? Kann ich also entweder den regulären Ausdruck direkt in der split()-Methode verwenden, oder muss ich mittels while-Schleife nochmal manuell die Anzahl der Teile im Matcher durchzählen?

Vielen Dank und Gruß
Daniel


----------



## Wildcard (28. Nov 2008)

Wenn du unbedingt ein Array willst, dann zB so:

```
String x = "\"abc, def\",huhu,\"blubb,blah\",hallo";
Matcher mat = Pattern.compile("(\"(.*?)\"|([^,]+)),?").matcher(x);
List<String> result = new ArrayList<String>();
while (mat.find()) {
    	result.add(mat.group(2) == null ? mat.group(3) : mat.group(2));
}
String[] array = result.toArray(new String[result.size()]);
```


----------



## Daniel_L (28. Nov 2008)

Eine (hoffentlich) letzte Frage: Wieso sind die Parameter für mat.group() hier 2 und 3, im ersten Beispiel 1? Ich hab zwar die JavaDoc zu Matcher.group gelesen, aber nicht verstanden...


----------



## Wildcard (28. Nov 2008)

Um die " rauszuschneiden habe ich zwei neue Capturing Groups eingefügt, daher verschieben sich die interessanten Groups. Group 1 muss eigentlich keine Capturing Group mehr sein, daher kann man auch am Anfang der ersten Group noch ein ?: einfügen. Dann sind die relevanten Capturing Groups 1 und 2


----------



## Daniel_L (28. Nov 2008)

Ah, vielen Dank! Zumindest etwas mehr habe ich jetzt verstanden.


----------

