# Leerzeilen aus einem String entfernen



## Dimax (28. Aug 2018)

Hallo Leute,
 Wie kann man aus einem String Leerzeilen entfernen.
Mein Versuch:
String data; //Enthält ein Text mit überflüssigen Leerzeilen
String temp=new String(data.replaceAll("\r+","\r");   //also "+" steht für mehrere 
                                                                             //  wenn ich richtig verstehe
hab gegoogelt aber nichts gefunden..Hat jemand eine Idee wie man es lösen kann?


----------



## Robat (28. Aug 2018)

`String#trim()` löscht alle überflüssigen Leerzeichen, Leerzeilen, ... am Anfang / Ende des Strings.


----------



## Robat (28. Aug 2018)

Ansonsten vielleicht eher so: 

```
String text = "\nHallo\n\n";
text = text.replaceAll(System.lineSeparator() + "+", "");
```


----------



## Dimax (28. Aug 2018)

Danke Robat für deine Antworten. trim() reicht nicht ,weil text hat mitten drin überflüssigen Leerzeilen.
Zweite Lösung hab grade ausprobiert hat nichts geändert.


----------



## Robat (28. Aug 2018)

Dimax hat gesagt.:


> Zweite Lösung hab grade ausprobiert hat nichts geändert


Das kann nicht sein. Zeig mal deinen Code..


----------



## Dimax (28. Aug 2018)

StringBuffer temp=new StringBuffer(data.trim().replaceAll(System.lineSeparator()+"+",""));


----------



## Dimax (28. Aug 2018)

```
StringBuffer temp=new StringBuffer(data.trim().replaceAll(System.lineSeparator()+"+",""));
```


----------



## Robat (28. Aug 2018)

Dann doch händisch. Das sollte jeztt eigentlich alle Windows, UNIX bzw Mac Zeilenumbrüche löschen.

```
String text = text.replaceAll("\\r\\n|\\r|\\n", "");
```


----------



## MoxxiManagarm (28. Aug 2018)

Dimax hat gesagt.:


> ```
> StringBuffer temp=new StringBuffer(data.trim().replaceAll(System.lineSeparator()+"+",""));
> ```



Meine Vermutung wäre, dass nach dieser Zeile temp nicht mehr zum Einsatz kommt, sondern immernoch data abgefragt wird?


----------



## Robat (28. Aug 2018)

@MoxxiManagarm Würde die Variante nicht auch dann fehlschlagen, wenn die Datei auf nem UNIX (bspw) erstellt wurde und das Programm auf nem Windows ausgeführt wird? Daher noch mal die "händische" Variante


----------



## Dimax (28. Aug 2018)

)).Entschuldigung Robat.Die zweite Lösung von dir hate im laufendem Programm ausprobiert. Nach dem Neustart gings alles ..aber jetzt ist der ganze Text eine Zeile))


----------



## Robat (28. Aug 2018)

Was erwartest du denn wenn du alle Zeilenumbrüche löschst?


----------



## MoxxiManagarm (28. Aug 2018)

Robat hat gesagt.:


> @MoxxiManagarm Würde die Variante nicht auch dann fehlschlagen, wenn die Datei auf nem UNIX (bspw) erstellt wurde und das Programm auf nem Windows ausgeführt wird? Daher noch mal die "händische" Variante



Ich schätze schon aber ich habe auch keine Variante aufgeführt, nur zitiert


----------



## Dimax (28. Aug 2018)

Hab sehr oft in Foren gelesen das die RegEx mehr Problemme mit sich bringen als man davor hatte..Deswegen + funkzioniert auch hier nicht


----------



## Dimax (28. Aug 2018)

Robat hat gesagt.:


> Dann doch händisch. Das sollte jeztt eigentlich alle Windows, UNIX bzw Mac Zeilenumbrüche löschen.
> 
> ```
> String text = text.replaceAll("\\r\\n|\\r|\\n", "");
> ```


Auch diese Lösung löscht alle Zeilenumbruche .Brauche nur aufeinanderfolgende aussortieren.


----------



## Robat (28. Aug 2018)

Dimax hat gesagt.:


> .Brauche nur aufeinanderfolgende aussortieren.


Das hattest du bisher aber nicht erwähnt  Du willst also einzelne Zeilenumbrüche stehen lassen und nur mehrere, aufeinanderfolgende Zeilenumbrüche löschen?


----------



## Dimax (28. Aug 2018)

Ja..deswegen war auch + nach dem \r zum aussortieren.


----------



## Dimax (28. Aug 2018)

Wie erkennt man eine Leerzeile? (nicht Leerzeichen) Aufeinanderfolgende Zeilenumbrüche ergeben Leerzeile..oder verstehe ich das falsch?


----------



## Robat (28. Aug 2018)

Okay also Leerzeilen könntest du damit erkennen:

```
String data = "Hello\nWorld\n\nFoo\r\n\r\nHello\rWorld";
data = data.replaceAll("[\\r|\\r\\n|\\n]{2,}", "\n");
System.out.println(data);
```
Damit erreichst du folgendes:

```
Hello
World

Foo

World
-->
Hello
World
Foo
World
```


----------



## Dimax (28. Aug 2018)

Vielen Dank Robat.


----------



## Robat (28. Aug 2018)

-delete


----------



## Dimax (30. Aug 2018)

Hab getestet. Beste Lösung die ich mit Robats Hilfe gefunden habe:

```
data=data.replaceAll("[\r]{2,}","");
```
Das entfernt wirklich nur die überflüssigen Zeilenumbruche,sprich Leerzeilen.
Danke Robat nochmals.


----------



## mrBrown (30. Aug 2018)

Dimax hat gesagt.:


> ```
> data=data.replaceAll("[\r]{2,}","");
> ```
> Das entfernt wirklich nur die überflüssigen Zeilenumbruche,sprich Leerzeilen.



...





mrBrown hat gesagt.:


> `\r` ist kein Zeilenumbruch, sondern ein "Wagenrücklauf".
> Unter Unixoiden ist das kein Teil des Zeilenumbruchs (dort ist es `\n`) und unter Windows nur die Hälfte (dort ist es `\r\n`), in beiden Fällen würden also der eigentlichen Zeilenumbrüche und damit auch die Leerzeilen bleiben.


----------



## Xyz1 (30. Aug 2018)

Da ist der Leichenschänder! 
fasst ihn!

Brownie hat recht, \n und nicht \r haben alle gemeinsam.

Oder: nein, nicht beste Lösung.

_Bearbeitung , Themen verwechselt._


----------



## Robat (30. Aug 2018)

DerWissende hat gesagt.:


> Oder: nein, nicht beste Lösung.


Wäre an besseren Lösungen interessiert


----------



## Xyz1 (30. Aug 2018)

alternation operator "|" in alternative groups (vielleicht)


----------



## Dimax (31. Aug 2018)

mrBrown hat gesagt.:


> ...


Unter Windows \n steht für Leerzeichen.Eine Leerzeile muss nicht unbedingt ein Leerzeichen enthalten also wenns \r\r
dann ist dass auch eine Leerzeile.Für  mein Programm hat die Lösung gereicht,aber ich universilisiere)) es gleich.


----------



## Dimax (31. Aug 2018)

```
if(System.getProperty("line.Separator").equals("\r")){
        test.replaceAll("[\r]{2,}", "");
    if(System.getProperty("line.Separator").equals("\n")){
        test.replaceAll("[\n]{2,}", "");
    }
```
Denke so passt für Unix und Windows,bleibt nur überlegen wenns wirklich ein oder mehrere Leerzeichen dazwischen stehen-also \r\n\r


----------



## max40 (31. Aug 2018)

damit löscht er auch Zeilen die ggf. nur Blanks und/oder Tabs beinhalten.

```
data = data.replaceAll("[\\r|\\r\\n|\\n]{1,}\\s{0,}[\\r|\\r\\n|\\n]{1,}", "\n");
```


----------



## Dimax (31. Aug 2018)

Dimax hat gesagt.:


> ```
> if(System.getProperty("line.Separator").equals("\r")){
> test.replaceAll("[\r]{2,}", "");
> }
> ...


Klammer vergessen


----------



## mrBrown (31. Aug 2018)

Dimax hat gesagt.:


> Unter Windows \n steht für Leerzeichen.Eine Leerzeile muss nicht unbedingt ein Leerzeichen enthalten also wenns \r\r
> dann ist dass auch eine Leerzeile.Für mein Programm hat die Lösung gereicht,aber ich universilisiere)) es gleich.


Nein!
' ' ist ein Leerzeichen
'\n' ist ein Zeilenvorschub.
'\r' ist ein Wagenrücklauf.

Unter Windows wird ein Zeilenumbruch mit "\r\n" abgebildet, unter Unix mit "\n". 


Wenn du aus deinem Text unter Windows alle '\r' entfernst, mag das in manchen Programmen nicht mehr nach einer Leerzeile aussehen, es sind aber weiterhin alle '\n' enthalten, und viele andere Programme werden das auch weiterhin als Leerzeile anzeigen.


----------



## mrBrown (31. Aug 2018)

Dimax hat gesagt.:


> ```
> if(System.getProperty("line.Separator").equals("\r")){
> test.replaceAll("[\r]{2,}", "");
> if(System.getProperty("line.Separator").equals("\n")){
> ...


line.seperator ist niemals "\r". Unter Windows "\r\n" und unter Unix "\n": https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#lineSeparator()

Und "\n" ist ganz sicher niemals ein Leerzeichen.


----------



## Dimax (31. Aug 2018)

mrBrown hat gesagt.:


> line.seperator ist niemals "\r". Unter Windows "\r\n" und unter Unix "\n": https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#lineSeparator()
> 
> Und "\n" ist ganz sicher niemals ein Leerzeichen.


Na endlich hab ich den Moderator gezwungen zu arbeiten,nicht nur rumkommentieren))
Danke mrBrown für deine volständige Erklärung.

```
if(System.getProperty("line.Separator").equals("\r\n")){
        test.replaceAll("[\r\n]{2,}", "");
}
if(.getProperty("line.Separator").equals("\n")){
        test.replaceAll("[\n]{2,}", "");
}
```
So ist dann am Besten,weil alle Möglichkeiten ,die vorkommen können,kann man nicht aussortieren.
Es könnte ja zwischen  line.Separatoren Leerzeichen,Tabulator,Zeilenvorschub in verschiedenen Kombinationen und Anzahl stehen.


----------



## mrBrown (31. Aug 2018)

Dimax hat gesagt.:


> So ist dann am Besten,weil alle Möglichkeiten ,die vorkommen können,kann man nicht aussortieren.
> Es könnte ja zwischen line.Separatoren Leerzeichen,Tabulator,Zeilenvorschub in verschiedenen Kombinationen und Anzahl stehen.


Doch, dass kann man alles recht leicht abdecken. Was genau ist denn die Anforderung?

Aktuell wird aus:

```
ab

cd
ef
```

dieses:

```
abcd
ef
```

Soll das genau so sein oder sollte es eher dies werden?

```
ab
cd
ef
```


----------



## Robat (31. Aug 2018)

@mrBrown der RegEx aus #19 macht doch aber genau das... ?


----------



## Dimax (31. Aug 2018)

In meinem Programm hat mir die letzte Lösung gereicht ,weil ich selbst aus dem Programm Kommentare entfernt habe und ich weiß ,dass da nichts dazwischen steht.Ich sollte die Leerzeilen entfernen nur um die Anzahl an Codezeilen zu rauskriegen
Dann ist die Frage wie viele Möglichkeiten gibt es denn, wenn aber in Leerzeilen etwas bleibt ..Wir haben 3 Zeichen \n ,\s, ' ' die dazwischen stehen können
könnte sein dass Leerzeile so was enthält:-' '\n' '\s\n' ' zmb.


----------



## Dimax (31. Aug 2018)

Robat hat gesagt.:


> @mrBrown der RegEx aus #19 macht doch aber genau das... ?


Bei mir ging es nur ohne maskiertem \ also \r anstatt \\r
Oder hab wieder was falsch?


----------



## mrBrown (31. Aug 2018)

Robat hat gesagt.:


> @mrBrown der RegEx aus #19 macht doch aber genau das... ?


Deine schon, aber die Lösung von @Dimax macht halt immer irgendwelche anderen Dinge...


----------



## Dimax (4. Sep 2018)

Entschuldigung Leute wenn ich jemandem auf die Nerven gehe aber ich brauche wirklich Hilfe.
Seit einer Woche sitze ich mit diesem String und werde deswegen bald gefeuert,wenns weiter so bleibt.
alle oben genante Lösungen haben funktioniert bei allen zum Test gemachten Strings,nur nicht bei dem Programm.
Ich habe einen MDWZ1020.txt (enthält SAS-Programm) File der in einen String data eingelesen wird:
ADD   NAME=MDWZ1020
/* MDWZ1020_SAS______SOURCE___SASMACRO_XXXX_2017-10-16-13.34.16. */
/* 000000_5_0103 */
  /******************************************************************/
  /* [?PROGNAME MDWZ1020?]                                          */
  /* [?PROGTYPE MACRO?]                                             */
  /* [?PROGCAT MAPPING?]                                            */
  /* [?PROJECT Umstellung Mercator-Mappings auf SAS?]               */
  /* [?AUTHOR xxxxxxxx?]                                    */
  /* [?CREATED 28.08.2003?]                                         */
  /* [?LASTCHG 16.10.2017?]                                         */
  /* [?PROGDESC Erstellung der Tabelle beziehungsarten durch        */
  /*   Sortierung der Tabelle pilot.bezarten?]                      */
  /* [?INPUT pilot.bezarten?]                                       */
  /* [?OUTPUT beziehungsarten?]                                     */
  /* [?EXECUTION Job: xxxxx Mapping: xxxx]                        */
  /* [?CHGHIST                                                      */
  /*  07.11.2016 | MD        | Migration nach Unix                  */
  /*  16.10.2017 | RG        | Inline-Dokumentation eingefuegt?]    */
  /******************************************************************/


  %MACRO mdwz1020;

    OPTIONS  NOCENTER;

    /* [?PART1?]                                                    */
    /* [?PARTDESC Erstellung diverser globaler Macrovariablen?]     */
    %GLOBAL inlib auslib ds_name brm_name view_name;
    %LET inlib     = pilot;
    %LET auslib    = brmsas;
    %LET ds_name   = beziehungsarten;
    %LET brm_name  = &auslib..beziehungsarten;
    %LET view_name = &auslib..v_beziehungsarten;
    /* [?ENDPART?]                                                  */

    /* [?STEP1?]                                                    */
    /* [?STEPTYPE PROC SORT?]                                       */
    /* [?STEPDESC Sortieren von pilot.bezarten nach personen und    */
    /*  Ausgabe als beziehungsarten?]                               */
    PROC SORT DATA = &inlib..bezarten(KEEP = ckontoid
                                             cpersnr
                                             personen
                                             rollenar
                                             rolle
                                             klammer
                                             textpart
                                             kontonr
                                             aufldat
                                             beziehun)
              OUT = &ds_name;
      BY personen;
    RUN;
    /* [?ENDSTEP?]                                                  */

  %MEND; 

Im Programm mache ich Methoden Aufruf um die Kommentare zu Entfernen.

```
data=Analyse.EntferneKommentar(data);
```
Die Methode EntferneKommentar() sieht so aus:

```
public static String EntferneKommentar(String text){
   
        final String flagKomAnf=new String("/*");
        final String flagKomEnd=new String("*/");
        String temp=new String("");
       
        for (int i=0;i<text.length()-2;i++){
            temp=text.substring(i, i+2);
            if(temp.equals(flagKomAnf)){
                text=text.substring(0,text.indexOf(temp)).concat(text.substring(text.indexOf(flagKomEnd, text.indexOf(temp))+2,text.length()));
            }
        }
       
        if (System.getProperty("line.separator").equals("\r\n")){
            text.replace("[\r\n]{2,}","");
           
        }
        if(System.getProperty("line.separator").equals("\n")){
            text.replace("[\n]{2,}","");
        }
       
       
        return text;
    }
```
Die Kommentare werden entfernt aber die Leerzeilen bleiben da,egal was ich mache.
Ausgabe String sieht so aus bei mir:
ADD NAME=MDWZ1020





















 %MACRO mdwz1020;

 OPTIONS NOCENTER;



 %GLOBAL inlib auslib ds_name brm_name view_name;
 %LET inlib = pilot;
 %LET auslib = brmsas;
 %LET ds_name = beziehungsarten;
 %LET brm_name = &auslib..beziehungsarten;
 %LET view_name = &auslib..v_beziehungsarten;






 PROC SORT DATA = &inlib..bezarten(KEEP = ckontoid
 cpersnr
 personen
 rollenar
 rolle
 klammer
 textpart
 kontonr
 aufldat
 beziehun)
 OUT = &ds_name;
 BY personen;
 RUN;


 %MEND

Hat jemand Ahnung wo mein Fehler ist?
Danke im Voraus.


----------



## fhoffmann (4. Sep 2018)

Strings sind unveränderbar. Desahlb musst du schreiben

```
text = text.replace("...");
```


----------



## Flown (4. Sep 2018)

Wow. Wenn man dadurch den Job verliert...

Dein Problem: Strings sind immutable und replace(All) verlangt, dass man auch den return-value berücksichtigt. Desweiteren wäre Regex genau das richtige, wobei ich einen Parser bevorzugen würde!

```
String in = "ADD NAME=MDWZ1020\n" +
    "/* MDWZ1020_SAS______SOURCE___SASMACRO_XXXX_2017-10-16-13.34.16. */\n" +
    "/* 000000_5_0103 */\n" +
    "/******************************************************************/\n" +
    "/* [?PROGNAME MDWZ1020?] */\n" +
    "/* [?PROGTYPE MACRO?] */\n" +
    "/* [?PROGCAT MAPPING?] */\n" +
    "/* [?PROJECT Umstellung Mercator-Mappings auf SAS?] */\n" +
    "/* [?AUTHOR xxxxxxxx?] */\n" +
    "/* [?CREATED 28.08.2003?] */\n" +
    "/* [?LASTCHG 16.10.2017?] */\n" +
    "/* [?PROGDESC Erstellung der Tabelle beziehungsarten durch */\n" +
    "/* Sortierung der Tabelle pilot.bezarten?] */\n" +
    "/* [?INPUT pilot.bezarten?] */\n" +
    "/* [?OUTPUT beziehungsarten?] */\n" +
    "/* [?EXECUTION Job: xxxxx Mapping: xxxx] */\n" +
    "/* [?CHGHIST */\n" +
    "/* 07.11.2016 | MD | Migration nach Unix */\n" +
    "/* 16.10.2017 | RG | Inline-Dokumentation eingefuegt?] */\n" +
    "/******************************************************************/\n" +
    "\n" +
    "\n" +
    "%MACRO mdwz1020;\n" +
    "\n" +
    "OPTIONS NOCENTER;\n" +
    "\n" +
    "/* [?PART1?] */\n" +
    "/* [?PARTDESC Erstellung diverser globaler Macrovariablen?] */\n" +
    "%GLOBAL inlib auslib ds_name brm_name view_name;\n" +
    "%LET inlib = pilot;\n" +
    "%LET auslib = brmsas;\n" +
    "%LET ds_name = beziehungsarten;\n" +
    "%LET brm_name = &auslib..beziehungsarten;\n" +
    "%LET view_name = &auslib..v_beziehungsarten;\n" +
    "/* [?ENDPART?] */\n" +
    "\n" +
    "/* [?STEP1?] */\n" +
    "/* [?STEPTYPE PROC SORT?] */\n" +
    "/* [?STEPDESC Sortieren von pilot.bezarten nach personen und */\n" +
    "/* Ausgabe als beziehungsarten?] */\n" +
    "PROC SORT DATA = &inlib..bezarten(KEEP = ckontoid\n" +
    "cpersnr\n" +
    "personen\n" +
    "rollenar\n" +
    "rolle\n\r" +
    "klammer\n" +
    "textpart\n" +
    "kontonr\n" +
    "aufldat\n" +
    "beziehun)\n" +
    "OUT = &ds_name;\n" +
    "BY personen;\n" +
    "RUN;\n" +
    "/* [?ENDSTEP?] */\n" +
    "\n" +
    "%MEND;";
System.out.println(in);
String comment = in.replaceAll("/\\*.*\\*/", "");
System.out.println(comment);
String linefeed = comment.replaceAll("(\n\r?){2,}", "$1");
System.out.println(linefeed);
```


----------



## Dimax (4. Sep 2018)

Danke fhoffmann hab geändert..Das war der Stand nach mehreren Aktualisierungen.
Jetz ist es

```
if (System.getProperty("line.separator").equals("\r\n")){
            text=text.replaceAll("[\r\n]{2,}","");
}
```
Und der String text ist eine Zeile geworden.
ADD   NAME=MDWZ1020                                    %MACRO mdwz1020;    OPTIONS  NOCENTER;            %GLOBAL inlib auslib ds_name brm_name view_name;    %LET inlib     = pilot;    %LET auslib    = brmsas;    %LET ds_name   = beziehungsarten;    %LET brm_name  = &auslib..beziehungsarten;    %LET view_name = &auslib..v_beziehungsarten;                        PROC SORT DATA = &inlib..bezarten(KEEP = ckontoid                                             cpersnr                                             personen                                             rollenar                                             rolle                                             klammer                                             textpart                                             kontonr                                             aufldat                                             beziehun)              OUT = &ds_name;      BY personen;    RUN;      %MEND jetz
Sollten aber nur Leerzeilen enfernt werden


----------



## fhoffmann (4. Sep 2018)

Du musst auch mehrere Zeilenumbrüche hintereinander durch einen Zeilenumbruch ersetzen (und nicht durch nichts).


----------



## mrBrown (4. Sep 2018)

Setz den Beispiel-Text auch in Code-Tags, der verliert sonst z.T. seine Formatierung 

Du solltest an der Stelle nicht mit line.separator arbeiten (und wenn nutz `System.lineSeparator()`), irgendwann gibt das garantiert Probleme, sondern immer mit "\r\n" *und* "\n" arbeiten.

Die Variante von @Flown funktioniert problemlos, wenn du noch Probleme hast, solltest du einmal den ganzen aktuellen Code zeigen.


----------



## fhoffmann (4. Sep 2018)

Hallo,

ein winziger Fehler ist noch in der Lösung von Flown:

```
public class Test {
   public static void main(String[] args) {
       String in = "Das ist /* k1 */ kein /* k2 */ Mist";
       String comment = in.replaceAll("/\\*.*\\*/", "");
       System.out.println(comment);
   }
}
```
Der reguläre Ausdruck muss deshalb lauten:

```
in.replaceAll("/\\*.*?\\*/", "");
```


----------



## Flown (4. Sep 2018)

fhoffmann hat gesagt.:


> ein winziger Fehler ist noch in der Lösung von Flown:


Kein winziger Fehler. Regex wurde auf Inputdaten ausgelegt und nicht auf alle Eventualitäten.


----------



## Flown (4. Sep 2018)

Aber wenn wir von kleinen Fehler sprechen:

```
"(?s)/\\*.*?\\*/"
```
Deckt den Fall:

```
/* 1. Row comment
2. Row comment */
```


----------



## Dimax (4. Sep 2018)

Vielen Dank fhoffmann ,mrBrown,Flown
Letzte Version 

```
public static String EntferneKommentar(String text){
String ohneKom=new String(text.replaceAll("/\\*.*?\\*/",""));
        String lastStand=new String(ohneKom.replaceAll("(\r\n?){2,}","$1"));
return lastStand;
    }
```
Entfernt Komentare -Perfekt
nur der String bleibt mit Leerzeilen(


----------



## Dimax (4. Sep 2018)

Die Methode EntferneKommentar(data) wird so aufgerufen

```
public static boolean SpeichernSteps(String data,int programm_id) throws IOException{
       
        String tempData=Analyse.EntferneKommentar(data);
       
        System.out.println(tempData +"jetz");.....................................................
```
Das ganze Programm kann ich nicht zeigen weil das ist ein Servlet mit 50 Files ungefähr .passt hier nicht rein))


----------



## Dimax (4. Sep 2018)

Hab gelöst.Nach langem drumrum fummeln))

```
public static String EntferneKommentar(String text){
        String ohneKom=new String(text.replaceAll("(?s)/\\*.*?\\*/",""));
        String ohneBlanks=new String(ohneKom.replaceAll("[' ']{2,}",""));
        String lastStand=new String(ohneBlanks.replaceAll("[\r\n|\n]{2,}","\r\n"));
return lastStand;
    }
```
Jetzt ist es so wie man es braucht.
Waren tatsächlich Leerzeichen zwischen Zeilenumbrüchen
Danke an alle Beteiligten,ohne eure Hilfe wäre ich gefeuert)


----------



## mrBrown (4. Sep 2018)

Willst du wirklich alle doppelten Leerzeichen entfernen?

```
a      b
```
 wird dann zu `ab`


----------



## Dimax (6. Sep 2018)

ja hast du Recht..Hab die Methode bisschen modifiziert und für Unix adoptiert.Und falls der System separator Problemme machen würde,sagt er Bescheid))

```
public static String EntferneKommentar(String text){
        String lastStand="System.getProperty(\"line.separator\") macht Problemme ";
        String ohneKom=new String(text.replaceAll("(?s)/\\*.*?\\*/",""));// RegEx für entferne Kommentare
        String ohneBlanks=new String(ohneKom.replaceAll("[' ']{2,}"," "));// RegEx für entferne überflüssige                                                                                                                            //Leerzeichen    
        if(System.getProperty("line.separator").equals("\r\n")){
        lastStand=ohneBlanks.replaceAll("[\r\n' ']{2,}","\r\n ");//RegEx für enferne Leerzeilen
        }
        else if(System.getProperty("line.separator").equals("\n")){
        lastStand=new String(ohneBlanks.replaceAll("[\n' ']{2,}","\n "));
        }
        return lastStand;
    }
```


----------



## Dimax (6. Sep 2018)

Sorry else if auch wie für Windows

```
lastStand=ohneBlanks.replaceAll("[\n' ']{2,}","\n ");
```


----------



## Xyz1 (6. Sep 2018)

Flown hat gesagt.:


> /* 1. Row comment


@Dimax 
Ich würd nicht immer ausgeschweiftere Regexes schreiben wenn auch Kommentare berücksichtigt werden sollen, gar über mehrere Zeilen hin und mit reluctant.... 
Geht es nur um eine Müllzeile, dann ist das vielleicht ok.
Ansonsten: heißt das Zauberwort PARSEN.


----------



## Dimax (6. Sep 2018)

In meinem Fall geht es hier wirklich nur um reines code ohne Kommentare,weil ich die Statistiken ausrechnen soll(anzahl_zeilen,Bytes of code usw.) und die Ausgangsdatei bleibt unverändert.Was  mir noch fehlt, wie kann ich regex anwenden um herausfinden ob gesuchtes Wort am Zeilenanfang steht?
Hab gefunden das ^ für Zeilenanfang steht aber wie komme ich an boolean damit?
zmb ich suche wort "DATA" das soll aber am zeilenanfang stehen es können aber nur die Leerzeichen davor sein.

```
for(int i=0;i<temp.length()-13;i++){
             
            temp4=temp.substring(i, i+4);
             
            if(temp4.equals("DATA") && Pattern.matches("^DATA",temp4)) //Ob es am Zeilenanfang steht??
```
glaub nicht dass es so einfach funktionieren wird aber immerhin ein Versuch))


----------



## Xyz1 (6. Sep 2018)

Dimax hat gesagt.:


> um reines code ohne Kommentare,weil ich die Statistiken ausrechnen soll


lass das besser, Du beherzigst meinen Ratschlag ja nicht


----------



## Dimax (6. Sep 2018)

DerWissende hat gesagt.:


> @Dimax
> wenn auch Kommentare berücksichtigt werden sollen, gar über mehrere Zeilen hin und mit reluctant....
> Ansonsten: heißt das Zauberwort PARSEN.


Gebe zu das habe ich wahrscheinlich nicht korrekt verstanden.Würdest du bitte mit einfacheren Worten schreiben.


----------



## Xyz1 (6. Sep 2018)

Nö.


----------



## Dimax (6. Sep 2018)

Na dann,Nase höher und nie wieder mit Erstklässlern sprechen))


----------



## Xyz1 (6. Sep 2018)

Wer spricht nicht mit wem?


----------



## mrBrown (6. Sep 2018)

Dimax hat gesagt.:


> In meinem Fall geht es hier wirklich nur um reines code ohne Kommentare,weil ich die Statistiken ausrechnen soll(anzahl_zeilen,Bytes of code usw.) und die Ausgangsdatei bleibt unverändert.Was  mir noch fehlt, wie kann ich regex anwenden um herausfinden ob gesuchtes Wort am Zeilenanfang steht?
> Hab gefunden das ^ für Zeilenanfang steht aber wie komme ich an boolean damit?
> zmb ich suche wort "DATA" das soll aber am zeilenanfang stehen es können aber nur die Leerzeichen davor sein.
> 
> ...



Was du in deinem Versuch macht, ist zu prüfen, ob die ersten 4 Zeichen genau "DATA" sind, und dann noch zu prüfen, ob die ersten 4 Zeichen DATA sind. Das klappt, wenn die ersten 4 Zeichen DATA sind, aber nicht mehr bei Leerzeichen.

Der Regex den du brauchst dürfte etwas in der Art sein: `"^\\s*DATA.*"`.

"^" entspricht dem Zeilenanfang.
"\\s*" beliebig viel Whitespace
"DATA"" deinem gesuchte Wort
".*" beliebigen folgenden Buchstaben

Deinen Code könntest du etwa mit sowas ersetzen: 
	
	
	
	





```
if (temp.matches("^\\s*DATA.*")) {
//...
}
```


----------



## Dimax (7. Sep 2018)

Vielen Dank mrBrown


----------

