Leerzeilen aus einem String entfernen

Dimax

Top Contributor
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?
 
Ansonsten vielleicht eher so:
Java:
String text = "\nHallo\n\n";
text = text.replaceAll(System.lineSeparator() + "+", "");
 
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.
 
Java:
StringBuffer temp=new StringBuffer(data.trim().replaceAll(System.lineSeparator()+"+",""));
 
Dann doch händisch. Das sollte jeztt eigentlich alle Windows, UNIX bzw Mac Zeilenumbrüche löschen.
Java:
String text = text.replaceAll("\\r\\n|\\r|\\n", "");
 
@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
 
)).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))
 
Hab sehr oft in Foren gelesen das die RegEx mehr Problemme mit sich bringen als man davor hatte..Deswegen + funkzioniert auch hier nicht
 
Wie erkennt man eine Leerzeile? (nicht Leerzeichen) Aufeinanderfolgende Zeilenumbrüche ergeben Leerzeile..oder verstehe ich das falsch?
 
Okay also Leerzeilen könntest du damit erkennen:
Java:
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:
Code:
Hello
World

Foo

World
-->
Hello
World
Foo
World
 
Hab getestet. Beste Lösung die ich mit Robats Hilfe gefunden habe:
Java:
data=data.replaceAll("[\r]{2,}","");
Das entfernt wirklich nur die überflüssigen Zeilenumbruche,sprich Leerzeilen.
Danke Robat nochmals.
 
Java:
data=data.replaceAll("[\r]{2,}","");
Das entfernt wirklich nur die überflüssigen Zeilenumbruche,sprich Leerzeilen.

...
\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.
 
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. 🙁
 
Java:
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
 
damit löscht er auch Zeilen die ggf. nur Blanks und/oder Tabs beinhalten.
Java:
data = data.replaceAll("[\\r|\\r\\n|\\n]{1,}\\s{0,}[\\r|\\r\\n|\\n]{1,}", "\n");
 
Zuletzt bearbeitet:
Java:
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
Klammer vergessen
 
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.
 
Java:
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
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.
 
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.
Java:
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.
 
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:
Code:
ab

cd
ef

dieses:
Code:
abcd
ef

Soll das genau so sein oder sollte es eher dies werden?
Code:
ab
cd
ef
 
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.
 
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.
Java:
data=Analyse.EntferneKommentar(data);
Die Methode EntferneKommentar() sieht so aus:
Java:
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.
 
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!
Java:
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);
 
Danke fhoffmann hab geändert..Das war der Stand nach mehreren Aktualisierungen.
Jetz ist es
Java:
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
 
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.
 
Hallo,

ein winziger Fehler ist noch in der Lösung von Flown:
Java:
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:
Java:
in.replaceAll("/\\*.*?\\*/", "");
 
Aber wenn wir von kleinen Fehler sprechen:
Java:
"(?s)/\\*.*?\\*/"
Deckt den Fall:
Code:
/* 1. Row comment
2. Row comment */
 
Vielen Dank fhoffmann ,mrBrown,Flown
Letzte Version
Java:
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(
 
Die Methode EntferneKommentar(data) wird so aufgerufen
Java:
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))
 
Hab gelöst.Nach langem drumrum fummeln))
Java:
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)
 

Zurück
Oben