7
votes

Remplacer plusieurs \ n avec 1 dans JavaScript

Comment puis-je remplacer plusieurs \ n code> s avec juste un? Donc, si un utilisateur entre dans

blah
blahdy blah
blah blah


0 commentaires

6 Réponses :


18
votes

Cela a fonctionné pour moi:

string = string.replace(/(\r\n|\r|\n)+/g, '$1');


7 commentaires

Comme je l'ai dit sur l'autre réponse: si l'entrée provient d'une application sur Windows qui utilise des terminaisons de ligne OS par défaut, ou tout autre système d'exploitation avec des terminaisons de ligne CR + LF Cela ne fonctionnera pas, car les personnages ressemblent à: \ r \ n \ r \ n \ r \ n . Avis Il n'y a pas de caractères multiples \ n d'une ligne.


Dans votre édition, .replace (/ (\ r \ n) + / g, '\ r \ n') devrait être .replace (/ (\ r \ n) + / g , '\ n') de sorte que le second .replace () n'a pas besoin de traiter avec le \ r .


@Patrick DW: pas si l'OP souhaite préserver le format de fin de ligne d'origine, non?


Oui, si vous voulez le préserver, vous le garderiez de même.


@Patrick Je pense que l'édition a l'air bien comme c'est. Ceci est plus sûr pour affichant la chaîne résultante de la chaîne résultante dans le système d'exploitation d'origine, car elle préserve la fin de la ligne. Il n'y a pas de conflit avec le second remplacer car \ r \ n Les terminaisons de ligne n'ont pas de répétition \ r caractères. @Dan +1 pour vos modifications.


@Dan réfléchissant à la truc de la conservation de la ligne, qu'en est-il string.replace (/ (\ r \ n | \ r | \ n) + / g, "1 $"); ? Cela fonctionne assez bien dans mes tests.


@Renèse: En fait, j'ai eu une pensée similaire, mais mon regex-fu est faible et j'ai oublié comment vous vous référez au premier groupe capturé, donc j'étais comme "hein, vissez-la". Mais oui, bon appel; C'est définitivement looks un nombre de bits (au moins) que (au moins) que les appels remplacent .



7
votes

Utilisez simplement une classe de caractères pour remplacer un ou plusieurs \ n ou \ r avec un seul \ n : Applications, un seul \ N La fin de la ligne est géré gracieusement, c'est pourquoi j'ai utilisé cela comme ma chaîne de remplacement ici. Cependant, des applications plus primitives sur CR + LF ( \ r \ n ) Les systèmes d'exploitation afficheront tout le texte exécuté sans le \ r \ n , auquel cas vous pouvez utiliser La réponse de Dan Tao , qui fournit une solution pour préserver les terminaisons de ligne ou les suivantes, qui accomplissent une chose similaire dans un appel: xxx


0 commentaires

3
votes
var blah = "blah\n\nblahdy blah\n\n\n\nblah blah\n";
var squeezed = blah.replace(/\n+/g, "\n");

2 commentaires

Si l'entrée provient d'une application sur Windows qui utilise des terminaisons de ligne d'exploitation par défaut, ou tout autre système d'exploitation avec CR + LF Line terminaison Cela ne fonctionnera pas, car le texte ressemblera à: \ r \ n \ r \ n \ r \ n . Avis Il n'y a pas de caractères multiples \ n d'une ligne.


@Renèse Vous avez raison. Je ne fais plus beaucoup de développement dans Windows si négligé. @Mazlix, vous devez accepter la réponse de Renesis comme c'est à la fois correct et a un exemple.



2
votes

Vous pouvez utiliser REGEX

xx.replace(/\n+/g, "\n");


0 commentaires

1
votes

ou sans la surcharge du moteur JavaScript configurant une machine à états finie pour exécuter l'expression régulière, vous pouvez le faire avec des tableaux:

s = s.split("\n").join("");


10 commentaires

Intéressant, vous rendez le poids lourd pour courir des expressions régulières, mais y a-t-il des preuves réelles sur les différences de performance?


Split et rejoindre sont à la fois O (N), avec relativement peu de frais générale, correspondant à une chaîne à une expression régulière est O (mn), m = nombre d'états dans la FSM, plus à la mise en place. Vous n'avez pas besoin de monde réel lorsque les maths vous disent le contraire;)


Je prie de différer, car les constantes de ces opérations jouent très fortement dans des situations comme celle-ci.


Eh bien, il est prévu de savoir si la complexité des opérations dans la scission et la jointure (procédures très simples) l'emporte sur la surcharge dans la mise en place et l'exécution de l'expression régulière ou non. Je sais que je préférerais aller pour. Notez également que n pour la jointure est plus petite que pour la scission, même si les éléments sont plus grands.


Je pense que cela mérite d'être conscient des options. +1


Cheers, il est également bon de tout interroger. C'est une honte que les gens choisissent simplement la chose qui fonctionne sans avoir l'air plus profonde.


Sauf que cela ne fonctionne pas, -1. Et aussi, je parie est plus lent sur des cordes avec un grand nombre de lignes.


@Qtax, 1) Cela fonctionne, je l'ai fait plusieurs fois - n'hésitez pas à l'essayer, et 2) comprenez-vous la notation asymptotique?


@Giffin, JSFIDDLE.net/pyycs et n'hésitez pas à démontrer S / \ n + // g vs split ("\ n"). Joindre ("") Performance (même si une chaîne de remplacement fonctionnerait beaucoup mieux).


@Qtax, +1 Oui, vous êtes correct. Dans ma hâte, j'ai lu la question comme désirant éliminer tous les lames.



1
votes

faire de même pour les espaces avec des exemples détaillés: Regex à Remplacez plusieurs espaces par un seul espace . Exemple: xxx


0 commentaires