So entfernen Sie alle Zeilenumbrüche aus einer Zeichenfolge

440

Ich habe einen Text in einem Textbereich und lese ihn mit dem Attribut .value vor.

Jetzt möchte ich alle Zeilenumbrüche entfernen (das Zeichen, das beim Drücken erzeugt wird Enter ) aus meinem Text entfernen, indem ich jetzt .replace mit einem regulären Ausdruck verwende. Aber wie zeige ich einen Zeilenumbruch in einem regulären Ausdruck an?

Wenn das nicht möglich ist, gibt es einen anderen Weg?

Flügelklinge
quelle

Antworten:

501

Dies ist wahrscheinlich eine FAQ. Auf jeden Fall können Zeilenumbrüche (besser: Zeilenumbrüche) Carriage Return (CR, \rauf älteren Macs), Line Feed (LF \n, auf Unices inkl. Linux) oder CR sein, gefolgt von LF ( \r\n, unter WinDOS). (Im Gegensatz zu einer anderen Antwort hat dies nichts mit der Zeichenkodierung zu tun.)

Daher ist das effizienteste RegExpLiteral für alle Varianten

/\r?\n|\r/

Wenn Sie alle Zeilenumbrüche in einer Zeichenfolge abgleichen möchten, verwenden Sie eine globale Übereinstimmung.

/\r?\n|\r/g

beziehungsweise. Fahren Sie dann mit der replacein mehreren anderen Antworten vorgeschlagenen Methode fort. (Wahrscheinlich möchten Sie die Zeilenumbrüche nicht entfernen, sondern durch andere Leerzeichen ersetzen, z. B. das Leerzeichen, damit die Wörter intakt bleiben.)

Spitze Ohren
quelle
16
Der Vollständigkeit halber ist zu beachten, dass Unicode vier verschiedene neue Zeilenzeichen enthält: \u000aoder \n, bei denen es sich um einen Zeilenvorschub handelt; \u000doder \r, was ein Wagenrücklauf ist; \u2028ein Zeilentrennzeichen; und \u2029ein Absatztrennzeichen. In der Praxis ist der von Ihnen veröffentlichte Regex jedoch in den meisten Fällen ausreichend.
Mathias Bynens
4
@MathiasBynens Danke, aber U + 2028 und U + 2029 ausdrücklich nicht nicht Zeilenumbrüche in HTML (4,01) bilden, die der DOM - Baum und der Live - Wert des Textbereiches auf basieren: w3.org/TR/html4/struct/text.html #whitespace
PointedEars
5
@PointedEars Ja, aber eine HTML-Serialisierung tritt nicht auf, wenn der Textbereich .valuedynamisch festgelegt wird, z textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Aber dies ist wahrscheinlich ein Randfall - wie gesagt, in den meisten Fällen ist Ihre Regex ausreichend.
Mathias Bynens
2
@MathiasBynens Da U + 2028 und + 2029 U keine Zeilenumbrüche in HTML (4,01) bilden, wird diese Zuweisung nicht bei jeder größeren DOM Implementierung und Layout - Engine zwei Zeilen in der TextArea- anzuzeigen. Also würde niemand, der bei klarem Verstand ist, überhaupt eine solche Aufgabe machen.
PointedEars
1
Ich musste dem Backslash entkommen, damit dies für mich funktioniert, dh textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 noch. Vielen Dank
Crab Bucket
511

Wie Sie einen Zeilenumbruch finden, hängt von den Betriebssystemcodierungen ab. Windows wäre \r\n, aber Linux verwendet nur \nund Apple verwendet \r.

Ich fand dies in JavaScript-Zeilenumbrüchen :

someText = someText.replace(/(\r\n|\n|\r)/gm, "");

Das sollte alle Arten von Zeilenumbrüchen entfernen.

Eremit
quelle
18
Warum ist das getrennte \r\n und \n und \r besser als nur /[\n\r]/g? Dies ist sicherlich langsamer als es sein sollte, da nur jedes Zeichen mit dem Satz von zwei möglichen Optionen verglichen werden muss.
Gone Coding
2
Beim Parsen der zurückgegebenen Daten von memcached in node.js mit / [\ n \ r] / g hat sich das für mich bewährt. Vielen Dank Gone Coding! Die Option in der Antwort hat es abgeschlachtet.
Kyle Coots
111

var str = " \n this is a string \n \n \n"

console.log(str);
console.log(str.trim());

String.trim() Entfernt Leerzeichen vom Anfang und Ende von Zeichenfolgen ... einschließlich Zeilenumbrüchen.

const myString = "   \n \n\n Hey! \n I'm a string!!!         \n\n";
const trimmedString = myString.trim();

console.log(trimmedString);
// outputs: "Hey! \n I'm a string!!!"

Hier ist ein Beispiel für eine Geige: http://jsfiddle.net/BLs8u/

HINWEIS! Es werden nur der Anfang und das Ende der Zeichenfolge abgeschnitten, keine Zeilenumbrüche oder Leerzeichen in der Mitte der Zeichenfolge.

RobW
quelle
33
Dadurch werden nur Zeilenumbrüche am Anfang und Ende der Zeichenfolge entfernt. OP fragte, wie ALLE Zeilenumbrüche entfernt werden sollen.
Ian Walter
4
Ja, nur als Option hinzufügen.
RobW
1
Arbeitete für das, was ich brauchte - Anfang und Ende der Saite. Vielen Dank!
Harlin
46

Sie können \nin einem regulären Ausdruck für Zeilenumbrüche und \rfür Wagenrückläufe verwenden.

var str2 = str.replace(/\n|\r/g, "");

Unterschiedliche Betriebssysteme verwenden unterschiedliche Zeilenenden mit unterschiedlichen Mischungen von \nund \r. Diese Regex ersetzt sie alle.

Kendall Frey
quelle
Ich denke, dies wird nur das erste Vorkommen ersetzen
Sebas
5
/\n|\r/gist effizienter geschrieben /[\n\r]/goder sogar /[\n\r]+/g. Vermeiden Sie Wechsel, es sei denn, Sie brauchen es unbedingt.
PointedEars
Ich bin mir nicht sicher, ob dies eine Beschwerde ist. Es macht das, was ich gesagt habe: entferne ALLES, was nicht in diesem HEX-Bereich liegt. Welche Zeichen das sind, hängt natürlich vom Zeichensatz ab, aber in diesem Beitrag ging es um ASCII.
Masi
22

Wenn Sie alle Steuerzeichen einschließlich CR und LF entfernen möchten, können Sie Folgendes verwenden:

myString.replace(/[^\x20-\x7E]/gmi, "")

Es werden alle nicht druckbaren Zeichen entfernt. Dies sind alles Zeichen, die sich NICHT im ASCII HEX-Bereich befinden 0x20-0x7E. Sie können den HEX-Bereich nach Bedarf ändern.

Masi
quelle
2
Das wird auch einige nationale Zeichen aus anderen Sprachen als Englisch entfernen ....
Smentek
21

Die einfachste Lösung wäre:

let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

.replace()Mit /\s+/gregexp werden alle Gruppen von Leerzeichen in ein einzelnes Leerzeichen in der gesamten Zeichenfolge geändert. Anschließend werden alle überschüssigen .trim()Leerzeichen vor und nach dem Text entfernt.

Werden als Leerzeichen betrachtet:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

Freezystem
quelle
Genial, aber es funktioniert, wenn die Variable neu zugewiesen wird:str = str.replace(/\s+/g, ' ').trim();
Fred K
15
var str = "bar\r\nbaz\nfoo";

str.replace(/[\r\n]/g, '');

>> "barbazfoo"
Gordon Freeman
quelle
15

Verwenden Sie Folgendes, um neue Zeilenzeichen zu entfernen:

yourString.replace(/\r?\n?/g, '')

Dann können Sie Ihre Zeichenfolge kürzen, um führende und nachfolgende Leerzeichen zu entfernen:

yourString.trim()
Si7ius
quelle
6

Die Antwort von PointedEars ist alles, was die meisten von uns brauchen. Indem ich der Antwort von Mathias Bynens folgte, machte ich eine Wikipedia-Reise und fand Folgendes: https://en.wikipedia.org/wiki/Newline .

Das Folgende ist eine Drop-In-Funktion, die alles implementiert, was die obige Wiki-Seite zum Zeitpunkt dieser Antwort als "neue Zeile" betrachtet.

Wenn etwas nicht zu Ihrem Koffer passt, entfernen Sie es einfach. Wenn Sie auf der Suche nach Leistung sind, ist dies möglicherweise nicht der Fall, aber für ein schnelles Tool, das die Arbeit auf jeden Fall erledigt, sollte dies nützlich sein.

// replaces all "new line" characters contained in `someString` with the given `replacementString`
const replaceNewLineChars = ((someString, replacementString = ``) => { // defaults to just removing
  const LF = `\u{000a}`; // Line Feed (\n)
  const VT = `\u{000b}`; // Vertical Tab
  const FF = `\u{000c}`; // Form Feed
  const CR = `\u{000d}`; // Carriage Return (\r)
  const CRLF = `${CR}${LF}`; // (\r\n)
  const NEL = `\u{0085}`; // Next Line
  const LS = `\u{2028}`; // Line Separator
  const PS = `\u{2029}`; // Paragraph Separator
  const lineTerminators = [LF, VT, FF, CR, CRLF, NEL, LS, PS]; // all Unicode `lineTerminators`
  let finalString = someString.normalize(`NFD`); // better safe than sorry? Or is it?
  for (let lineTerminator of lineTerminators) {
    if (finalString.includes(lineTerminator)) { // check if the string contains the current `lineTerminator`
      let regex = new RegExp(lineTerminator.normalize(`NFD`), `gu`); // create the `regex` for the current `lineTerminator`
      finalString = finalString.replace(regex, replacementString); // perform the replacement
    };
  };
  return finalString.normalize(`NFC`); // return the `finalString` (without any Unicode `lineTerminators`)
});
futz.co
quelle
3
Erstens - für Leute, die feststellen, dass JS nicht verwendet wird - unterstützen "die meisten" RE-Aromen \R"alle" Linefeeds. Zweitens - warum nicht einfachsomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan
@ClasG, du machst einen guten Punkt. Ich denke, mein Gedankengang beim Schreiben war, aus Leistungsgründen nur replace()für das zu laufen lineTerminators, was in der Zeichenfolge vorhanden war.
futz.co
5

Ein Zeilenumbruch in Regex ist \ n, also wäre Ihr Skript

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));
h2ooooooo
quelle
5

Ich füge meine Antwort hinzu, es ist nur ein Addon zu dem oben genannten, da ich alle / n-Optionen ausprobiert habe und es nicht funktioniert hat. Ich habe gesehen, dass mein Text vom Server mit einem doppelten Schrägstrich kommt, also habe ich Folgendes verwendet:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');
Chaya D.
quelle
5

NUTZEN SIE DIESE FUNKTION UNTEN UND MACHEN SIE IHR LEBEN EINFACH

Am einfachsten ist es, reguläre Ausdrücke zu verwenden, um Zeilenumbrüche in der Zeichenfolge zu erkennen und zu ersetzen. In diesem Fall verwenden wir die Ersetzungsfunktion zusammen mit der Zeichenfolge, durch die ersetzt werden soll. In unserem Fall handelt es sich um eine leere Zeichenfolge.

function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}

Im obigen Ausdruck stehen g und m für globale und mehrzeilige Flags

vishu2124
quelle
2

Versuchen Sie den folgenden Code. Es funktioniert auf allen Plattformen.

var break_for_winDOS = 'test\r\nwith\r\nline\r\nbreaks';
var break_for_linux = 'test\nwith\nline\nbreaks';
var break_for_older_mac = 'test\rwith\rline\rbreaks';

break_for_winDOS.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_linux.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_older_mac.replace(/(\r?\n|\r)/gm, ' ');
// Output
'test with line breaks'
Robson Morais Santos
quelle
0

Verwenden \nSie auf einem Mac einfach in Regexp, um Zeilenumbrüche abzugleichen. Der Code lautet also string.replace(/\n/g, '')ps: Das g gefolgt bedeutet, dass alle statt nur der ersten übereinstimmen.

Unter Windows wird es sein \r\n.

Kobako
quelle