# String Manipulation - Leerzeichen



## reibi (18. Jan 2012)

Hallo

Ich möchte die nacheinanderfolgenden Leerzeichen in nem String auf jeweils ein reduzieren. WIe mach ich n das?
Hab mal folgendes Beipiel:

src: "Hallo________Forum,________________das_ist_ein___________________________Beipiel" //so isses
trg: "Hallo Forum, das ist ein Beipiel" // so solls sein

//Die Unterstriche mussste ich nur machen, weil der Broswser das eh reduziert. 

Hab mal das hier probiert


```
trg = src.replaceAll("  ", " ");
```

Das geht aber leider nich.

Gruß


----------



## irgendjemand (18. Jan 2012)

replaceAll erwartet eine RegEx ... und da die RegEx "  " keinen sinnvollen inhalt hat wird das was du vorhast natürlich auch nicht umgesetzt ...

ist leider ein beliebter anfänger fehler der durch die namensgebung dieser methode entsteht : viele denken wenn sie innerhalb eines strings z.b. alle vorkommenden leerzeichen durch z.b. %20 ersetzen müssen replaceAll verwenden müssten ... das ist aber falsch ... das macht schon replace() ... die einen normalen string erwartet ... und keine RegEx ...
das All im namen der methode kommt wahrscheinlich eher daher das du ja mit ner RegEx nur eine ungefähre form des zu suchenden / zu ersetzenden vorgeben kannst ... anstatt wie in replace() den genauen teilstring ... und dadurch die form der RegEx natürlich auf mehrere teilstrings zutreffen kann ...

beispiel

du willst aus einem string alle zahlen raushaben ... dafür kannst du entweder normal replace verwenden ... das würde dann so aussehen


```
String result=input.replace("0", "x").replace("1", "x").replace("2", "x")... // und soweiter
```

oder du nimmst eine RegEx


```
String result=input.replaceAll("[0-9]", "x");
```

ich hoffe der unterschied wird irgendwie klar ...


----------



## MichaelB_z7ssfr (18. Jan 2012)

```
StringTokenizer tok = new StringTokenizer("Das___________ist___________ein___________Text" );
StringBuilder builder = new StringBuilder();

if (tok.hasMoreTokens()) {
builder.append(tik.nextToken());
while (tok.hasMoreTokens()) {
  builder.append(" " + tok.nextToken());
}
```

Ungetestet, aber so ungefähr müsstes gehen


----------



## Michael... (18. Jan 2012)

```
String src = "Hallo        Forum,                das_ist_ein                           Beipiel";
System.out.println(src);
System.out.println(src.replaceAll(" +", " "));
```


----------



## musiKk (18. Jan 2012)

irgendjemand hat gesagt.:


> replaceAll erwartet eine RegEx ... und da die RegEx "  " keinen sinnvollen inhalt hat wird das was du vorhast natürlich auch nicht umgesetzt ...



Das ist nicht ganz richtig. Natürlich sind zwei Leerzeichen ein gültiger regulärer Ausdruck. Wenn man einen String bestehend aus vier Leerzeichen mit dem in der Frage angegebenen Ausdruck bearbeitet, erhält man einen String mit zwei Leerzeichen. Funktioniert also alles wie es soll. Die Erwartung, dass diese beiden Leerzeichen dann erneut durch ein einzelnes ersetzt werden sollen, ist hingegen falsch.


----------



## Gossi (18. Jan 2012)

musiKk hat gesagt.:


> Das ist nicht ganz richtig. Natürlich sind zwei Leerzeichen ein gültiger regulärer Ausdruck. Wenn man einen String bestehend aus vier Leerzeichen mit dem in der Frage angegebenen Ausdruck bearbeitet, erhält man einen String mit zwei Leerzeichen. Funktioniert also alles wie es soll. Die Erwartung, dass diese beiden Leerzeichen dann erneut durch ein einzelnes ersetzt werden sollen, ist hingegen falsch.



In diesem Fall müsste es so aussehen:


```
public class Test {

	public static void main(final String[] args) {
		int vorher = 0;
		String incomming = "Hallo                Forum           dies is    nen                Test";
		vorher = incomming.length() + 1;
		while (vorher > incomming.length()) {
			vorher = incomming.length();
			incomming = incomming.replace/* All */("  ", " ");
		}
		System.out.println(incomming);
	}

}
```

PS:
Wobei Michaels Beispiel definitiv besser ist..


----------



## irgendjemand (18. Jan 2012)

musiKk hat gesagt.:


> Das ist nicht ganz richtig. Natürlich sind zwei Leerzeichen ein gültiger regulärer Ausdruck. Wenn man einen String bestehend aus vier Leerzeichen mit dem in der Frage angegebenen Ausdruck bearbeitet, erhält man einen String mit zwei Leerzeichen. Funktioniert also alles wie es soll. Die Erwartung, dass diese beiden Leerzeichen dann erneut durch ein einzelnes ersetzt werden sollen, ist hingegen falsch.



ja gut ... dann halt so ... kenne mich mit RegEx leider nicht so perfekt aus ...
was ich eigentlich nur sagen wollte ist das replaceAll eine RegEx erwartet ... replace hingegen nicht ...
vielleicht war auch das beispiel falsch gewählt oder ich hab da was in der doc nicht richtig verstanden ... *dachte das man leerzeichen in der aufgabenstellung halt durch escape-sequenz deutlich machen müsste *\\{Space}*


----------



## reibi (18. Jan 2012)

@ Michael...
Dank für Deinen wirklich klasse-Beitrag - Das ganze funktioniert Astrein ;-)
Wer RegEx hat, hat die Macht

@alle anderen
auch danke


----------

