2013-05-04 7 views
33

Ich brauche JavaScript, um leere Zeilen in einem HTML-Textfeld zu entfernen. Die Leerzeilen können sich an beliebiger Stelle im textarea Element befinden. Eine Leerzeile kann nur eine Rückgabe oder Leerstellen plus Rückgabe sein.JavaScript: Wie verwende ich einen regulären Ausdruck, um leere Zeilen aus einer Zeichenfolge zu entfernen?

Ich erwarte eine reguläre Ausdruck Lösung zu diesem. Hier sind einige, die ich versucht, aber sie arbeiten nicht und kann nicht herausfinden, warum:

/^\s*\r?\n/g 

/^\s*\r?\n$/g 

Edit 1

Es scheint, dass die Lösung (ich es ein wenig modifiziert) von aaronman vorgeschlagen und m. buettner funktioniert:

string.replace(/^\s*\n/gm, "") 

Kann jemand sagen, warum mein erster regulärer Ausdruck nicht funktioniert?

Edit 2

Nachdem alle nützlichen Antworten zu lesen, kam ich mit auf den Punkt:

/^[\s\t]*(\r\n|\n|\r)/gm 

Ist das ein zu gehen, dass alle Situationen abdecken?

bearbeiten 3

Dies ist die prägnanteste ein für alle Räume (White Spaces, Tabs) und Plattformen (Linux, Windows, Mac).

/^\s*[\r\n]/gm 

Vielen Dank an m.buettner!

+3

'ich einen regulären Ausdruck Lösung erwarte hier this.' Ernähren Sie sich gesund und post die RegExp, wenn es nicht – Ejaz

+5

Tag funktioniert in titel: check, Kein code: check, Falsche einstellung: check, Ironic danke nachricht: check, Downvote: check. – elclanrs

+0

Auch wenn Sie neu auf dieser Website sind, können Sie nach etwas wie Regex-Leerzeilen oder etwas suchen. Sie können vom Beispiel sehen, was beantwortet wird und was direkt von der Karte gewählt wird ... zum Beispiel: http://stackoverflow.com/questions/3012788/how-to-check-if-a-line-is- blank-using-regex - das entspricht Ihren Bedürfnissen –

Antwort

53

Ihr Muster in Ordnung scheint, müssen Sie nur das mehrzeilige Modifikator m aufzunehmen, so dass ^ und $ Match Linie Anfänge und Enden sowie:

/^\s*\n/gm 

Ohne die m, die Anker nur Match-String-Anfänge und Enden.

Beachten Sie, dass Sie Mac-Endungen (nur \r) verpassen. Dies würde in diesem Fall helfen:

/^\s*[\r\n]/gm 

auch beachten, dass (in beiden Fällen) Sie nicht über die optionalen \r vor den \n explizit übereinstimmen müssen, weil die Pflege von \s* genommen wird.

Wie Dex in einem Kommentar hingewiesen, wird dies die letzte Zeile nicht löschen, wenn es nur aus Leerzeichen besteht (und es gibt keine Zeilenschaltung nach ihm). Eine Möglichkeit, das Problem zu beheben, wäre, die tatsächliche Zeilenschaltung optional zu machen, jedoch einen Anker für die Endzeile zu enthalten. In diesem Fall tun Sie die Linie entsprechen haben endend richtig aber:

/^\s*$(?:\r\n?|\n)/gm 
+0

m.buettner, vielen Dank für das Mac-Szenario. – curious1

+0

m.buettner, ich habe eine neue erstellt/^ [\ s \ t] * (\ r \ n | \ n | \ r)/gm. Wird es alle Situationen abdecken? – curious1

+0

@ curious1, \ s enthält alle Leerzeichen. Das sind Leerzeichen, \ t, \ r und \ n. Das war der Punkt der Verwendung von \ s an erster Stelle. Daher machen unsere Muster genau dasselbe, und ja, sie decken beide Fälle ab. –

15

Ich glaube, das ich denke,

searchText.replace(/(^[ \t]*\n)/gm, "") 
+0

Dies erlaubt nicht '\ r \ n' oder andere Leerzeichen vor dem Zeilenumbruch. –

+0

reparierte es, sein ursprünglicher Posten sagte nicht, dass eine Linie leer war, wenn es wirkliche Räume darin hatte – aaronman

+0

aaronman, danke für den zusätzlichen Code, \ t zu fangen. bin dankbar! – curious1

5

Dies sollte den Trick funktioniert:

var el = document.getElementsByName("nameOfTextBox")[0]; 
el.value.replace(/(\r\n|\n|\r)/gm, ""); 

EDIT: Entfernt drei Arten von Zeilenumbrüchen.

+0

Er möchte vor allem Zeilenumbrüche entfernen – Ejaz

+0

ahh .. Zeit zu schlafen, denke ich;) –

+0

Dies wird alle Zeilenumbrüche (nicht nur leere Zeilen) entfernen, und die "m" ist redundant. –

Verwandte Themen