web-dev-qa-db-fra.com

JavaScript: comment utiliser une expression régulière pour supprimer des lignes vides d'une chaîne?

J'ai besoin d'utiliser JavaScript pour supprimer les lignes vides dans une zone de texte HTML. Les lignes vides peuvent se trouver n'importe où dans l'élément textarea. Une ligne vierge peut être simplement un retour ou des espaces blancs plus un retour.

J'attends une solution d'expression régulière à cela. En voici quelques-unes que j'ai essayées, mais elles ne fonctionnent pas et ne peuvent pas comprendre pourquoi:

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

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

Modifier 1

Il semble que la solution (je l'ai un peu modifiée) proposée par aaronman et m.buettner fonctionne:

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

Quelqu'un peut-il dire pourquoi ma première expression régulière ne fonctionne pas?

Éditer 2

Après avoir lu toutes les réponses utiles, j'ai trouvé ceci:

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

Est-ce que ça va être celui qui couvrira toutes les situations?

Modifier

C'est le plus concis couvrant tous les espaces (espaces blancs, tabulations) et les plateformes (Linux, Windows, Mac).

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

Un grand merci à m.buettner!

44
curious1

Votre modèle semble correct, il vous suffit d'inclure le modificateur multiligne m, afin que ^ Et $ Correspondent également aux débuts et aux fins de ligne:

/^\s*\n/gm

Sans m, les ancres ne correspondent qu'aux débuts et fins de chaîne.

Notez que vous manquez les fins de ligne Mac (seulement \r). Cela aiderait dans ce cas:

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

Notez également que (dans les deux cas), vous n'avez pas besoin de faire correspondre explicitement \r Devant \n, Car cela est pris en charge par \s*.

Comme Dex l'a souligné dans un commentaire, cela n'effacera pas la dernière ligne si elle se compose uniquement d'espaces (et il n'y a pas de nouvelle ligne après). Un moyen de résoudre ce problème serait de rendre la nouvelle ligne réelle facultative mais d'inclure une ancre de fin de ligne devant elle. Dans ce cas, vous devez faire correspondre la ligne se terminant correctement cependant:

/^\s*$(?:\r\n?|\n)/gm
68
Martin Ender

Je crois que cela fonctionnera

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

Cela devrait faire l'affaire je pense:

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

EDIT: Supprime trois types de sauts de ligne.

5
Bjørn Bråthen