# Alle Leerzeichen aus String entfernen



## JaninaSt (16. Sep 2013)

Hallo!

Ich habe eine Textdatei zum Beispiel in dieser Form:
1
2
3
     GEFUNDEN
4


Jetzt möchte ich das ganze einlesen und in eine andere Textdatei ausgeben, was auch funktioniert. Allerdings möchte ich, dass bei der Ausgabe bei dem Wort GEFUNDEN, alle Leerzeichen davor verschwinden, die Ausgabedatei also so aussieht:
1
2
3
GEFUNDEN
4

Ich dacht mit der trim() Methode funktioniert das, geht aber nicht. Mach ich was falsch, oder gibts da ne bessere Methode dafür?
...

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
String line = in.readLine();
	while(line != null) {
		    if(line.equals("GEFUNDEN")) {
		    	out.println(line.trim());
		    }	    
...


----------



## geqoo (16. Sep 2013)

Mit der trim() Funktion werden alle Leerzeichen eines Strings entfernt.
Außerdem sind Strings nicht mutationsfähig, d.h. ein typischer Fehler ist, einfach

```
str.trim();
```
zu schreiben. Besser:

```
String newStr = str.trim();
```

Das wird dir aber in deinem Falle nicht helfen - nur mal so als Hinweis. 

Ich denke du kannst eine Funktion machen, die in Länge deines Strings solange alle führenden Leerzeichen entfernt, bis ein anderes Zeichen gefunden wird.
Beispielsweise so:


```
String line = "      GEFUNDEN";
for (char c : line.toCharArray()) {
  if (c.equals(" ")) {
    line = line.substring(1);
  } else {
    break;
  }
}
```


----------



## Natac (16. Sep 2013)

String.trim() ist, was du suchst. Allerdings solltest du vielleicht nicht [c]line[/c] sondern [c]line.trim()[/c] vergleichen.


----------



## Clayn (16. Sep 2013)

geqoo hat gesagt.:


> Mit der trim() Funktion werden alle Leerzeichen eines Strings entfernt.



Falsch es werden nur führende und folgende Leerzeichen entfernt laut Doku.


```
String str="a b c d";
str=str.trim();
```

dann bleibt das "a b c d"

bei 

```
String str="     a b c d";
str=str.trim();
```

kommt auch "a b c d" raus

Und wenns darum geht das "GEFUNDEN" zu "entdecken" unabhänig von führender Leerzeichen sollte ein

```
line.contains("GEFUNDEN");
```
 helfen


----------



## Gucky (16. Sep 2013)

Die replaceAll(String,String) Methode ist, denke ich mal, das was du suchst. Sie wird so verwendet: str.replaceAll(String der ersetzt werden soll, String der stattdessen eingesetzt werden soll)

In deinem Fall wäre der zweite String leer und der erste wäre nur ein Leerzeichen.

Gruß
Gucky


----------



## Fab1 (16. Sep 2013)

Gucky hat gesagt.:


> Die replaceAll(String,String) Methode ist, denke ich mal, das was du suchst. Sie wird so verwendet: str.replaceAll(String der ersetzt werden soll, String der stattdessen eingesetzt werden soll)
> 
> In deinem Fall wäre der zweite String leer und der erste wäre nur ein Leerzeichen.
> Gucky



So würde ich es auch machen. Erweiternd kann man hierzu noch sagen, dass es sich empfiehlt, wenn bei "GEFUNDEN" mehrere Leerzeichen davor sein können, dass man natürlich alle ersetzt. Hierbei schafft ein einfaches Regex Abhilfe.


```
replaceAll(" +","");
```

Hierbei würden also alle Leerzeichen - egal ob eins oder mehrere hintereinander - ersetzt werden.


----------



## Gucky (16. Sep 2013)

Ist das nicht grade der Witz von replaceAll(), dass diese Methode wirklich alles ersetzt, was im ersten String steht?

str="Strrrrrrrrrrrrrrrrring";
str1=str.replaceAll("r","");
System.out.println(str1); //Sting

Oder liege ich da falsch?


----------



## geqoo (17. Sep 2013)

Das ist richtig. Der Ausdruck von replaceAll wird aber als regulärer Ausdruck interpretiert, wenn ich mich nicht irre. Durch das + Zeichen von Fab werden also nur alle Leerzeichen vor dem "GEFUNDEN" entfernt.


----------



## Gucky (17. Sep 2013)

Also sagt das + dass hinter den Leerzeichen noch was kommen muss? Aber dann werden doch trotzdem alle Leerzeichen entfernt, bis auf die am Stringende.


----------



## geqoo (17. Sep 2013)

Gucky hat gesagt.:


> Also sagt das + dass hinter den Leerzeichen noch was kommen muss?



Nein.



Gucky hat gesagt.:


> Aber dann werden doch trotzdem alle Leerzeichen entfernt, bis auf die am Stringende.



Das + ist ein sog. Quantor (engl. quantifier / Wiederholungszeichen).

Auszug aus Wiki:

? 	Der voranstehende Ausdruck ist optional, er kann einmal vorkommen, muss es aber nicht, d. h. der Ausdruck kommt null- oder einmal vor. (Dies entspricht {0,1})
+ 	Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen. (Dies entspricht {1,})
* 	Der voranstehende Ausdruck darf beliebig oft (auch keinmal) vorkommen. (Dies entspricht {0,})

Evtl. wäre hier entsprechend das * angebracht.


----------



## Gucky (17. Sep 2013)

Ich versteh aber immer noch nicht, wie eine Regex da helfen sollte. Meiner Meinung nach ist das Ergebnis dasselbe. Die Leerzeichen sind weg.


----------



## Gucky (18. Sep 2013)

Achso. Jetzt verstehe ich erst, was du meinst. 

Also ich habe replaceAll() immer ohne Regex verwendet und bin immer gut ausgekommen. Selbst wenn der erste String als Regex interpretiert werden sollte, muss man dies nicht verwenden. Also einfach in den ersten String ein Leerzeichen und den zweiten string leer lassen und alle Leerzeichen werdeb entfernt.


----------



## Natac (19. Sep 2013)

Gucky hat gesagt.:


> Also ich habe replaceAll() immer ohne Regex verwendet und bin immer gut ausgekommen. Selbst wenn der erste String als Regex interpretiert werden sollte, muss man dies nicht verwenden. Also einfach in den ersten String ein Leerzeichen und den zweiten string leer lassen und alle Leerzeichen werdeb entfernt.


Nur zum Verständnis: Der String wird IMMER als Regex interpretiert. Egal ob du Regex-Steuerzeichen verwendest oder nicht.


----------



## Gucky (19. Sep 2013)

Also rufen beide Lösungen, die von geqoo und meine dasselbe Ergebnis hervor?


----------

