Entferne alle Leerzeichen aus String, behalte aber EINEN Zeilenvorschub

7

Ich habe diese Eingabe String (mit Tabulatoren, Leerzeichen, Zeilenumbrüchen):

%Vor%

[Bearbeiten]: Ich hätte die Zeichenfolge für einen besseren Test zur Verfügung gestellt, da stackoverflow alle Sonderzeichen (Tabs, ...) entfernt

%Vor%

Und ich möchte diesen Zustand erreichen:

%Vor% %Vor%

Irgendwelche Ideen? Kann dies mit Regexes erreicht werden?

replaceAll("\s+", " ") ist NICHT das, wonach ich suche. Wenn diese Regex genau 1 Newline der vorhandenen beibehalten würde, wäre es perfekt.

Ich habe das versucht, aber das scheint mir suboptimal zu sein ...:

%Vor%     
friesoft 19.03.2013, 08:39
quelle

5 Antworten

13

In einem einzigen Regex (plus einem kleinen Patch für Tabs):

%Vor%

Die Regex sieht entmutigend aus, zerlegt sich aber schön in diese Teile, die zusammen ODER-verknüpft sind:

  • ^\s+ - am Anfang Leerzeichen anpassen;
  • \s+$ - passt am Ende Whitespace an;
  • \s*(\n)\s* - Passt Leerzeichen an, die einen Zeilenumbruch enthalten, und erfasst diesen Zeilenumbruch;
  • (\s)\s* - Entspricht dem Leerzeichen und fängt das erste Leerzeichen ein.

Das Ergebnis ist eine Übereinstimmung mit zwei Capture-Gruppen, aber nur eine der Gruppen darf nicht gleichzeitig leer sein. Dadurch kann ich die Übereinstimmung durch "" ersetzen, was bedeutet, dass die beiden Erfassungsgruppen verkettet werden.

Das einzige verbleibende Problem besteht darin, dass ich eine Registerkarte nicht mit einem Leerzeichen ersetzen kann, wenn ich diesen Ansatz benutze. Also repariere ich das mit einem einfachen Zeichenaustausch ohne regulären Ausdruck.

    
Marko Topolnik 19.03.2013, 09:05
quelle
5

In 4 Schritten:

%Vor%     
MBO 19.03.2013 09:00
quelle
2

Ersetzen Sie zuerst alle neuen Zeilen durch eine neue Zeile , dann ersetzen Sie die Leerzeichen , aber keine neuen Zeilen , Als letztes sollten Sie alle Leerzeichen am Anfang der Zeichenfolge entfernen:

%Vor%

Ausgabe:

%Vor%     
Maroun 19.03.2013 08:49
quelle
2

Wenn ich richtig verstehe, möchten Sie einfach eine Folge von Zeilenumbrüchen durch eine neue Zeile ersetzen. Ersetzen Sie also \n\n* durch \n (mit entsprechenden Flags). Wenn in den Zeilen viele Leerräume vorhanden sind, entfernen Sie einfach den Leerraum ( ^\s\s*$ mit Mehrzeilenmodus) und ersetzen Sie dann die Zeilenumbrüche.

Bearbeiten: Das einzige Problem hier ist, dass einige Zeilenumbrüche hier und da bleiben können, also müssen Sie vorsichtig sein, zuerst Leerzeichen zu reduzieren und dann das Leerzeilenproblem zu beheben. Sie können es in wahrscheinlich eine einzige Regex weiter reduzieren, aber es ist einfacher, mit diesen drei zu lesen:

%Vor%     
wds 19.03.2013 08:45
quelle
0

Warum tust du das nicht?

%Vor%

Vergessen Sie nicht Ссылка

    
denis.solonenko 19.03.2013 08:48
quelle