Comment supprimer tous les sauts de ligne d'une chaîne

441

J'ai un texte dans une zone de texte et je l'ai lu à l'aide de l'attribut .value.

Maintenant, je voudrais supprimer tous les sauts de ligne (le caractère produit lorsque vous appuyez sur Enter) de mon texte en utilisant maintenant .replace avec une expression régulière, mais comment puis-je indiquer un saut de ligne dans une expression régulière?

Si ce n'est pas possible, existe-t-il une autre voie?

Wingblade
la source

Réponses:

502

Il s'agit probablement d'une FAQ. Quoi qu'il en soit, les sauts de ligne (mieux: les nouvelles lignes) peuvent être des retours chariot (CR ,, \rsur les anciens Mac), des \nsauts de ligne (LF ,, sur Unices incl. Linux) ou CR suivis de LF ( \r\n, sur WinDOS). (Contrairement à une autre réponse, cela n'a rien à voir avec le codage des caractères.)

Par conséquent, le RegExplittéral le plus efficace pour correspondre à toutes les variantes est

/\r?\n|\r/

Si vous souhaitez faire correspondre toutes les nouvelles lignes d'une chaîne, utilisez une correspondance globale,

/\r?\n|\r/g

respectivement. Continuez ensuite avec la replaceméthode comme suggéré dans plusieurs autres réponses. (Vous ne voulez probablement pas supprimer les sauts de ligne, mais remplacez-les par d'autres espaces, par exemple le caractère espace, afin que les mots restent intacts.)

Oreilles pointues
la source
16
Par souci d'exhaustivité, il convient de noter qu'il existe quatre nouveaux caractères de ligne différents dans Unicode: \u000aou \n, qui est un saut de ligne; \u000dou \r, qui est un retour chariot; \u2028, un séparateur de ligne; et \u2029, un séparateur de paragraphe. Dans la pratique cependant, l'expression régulière que vous avez publiée est suffisante dans la plupart des cas.
Mathias Bynens
4
@MathiasBynens Merci, mais U + 2028 et U + 2029 ne constituent pas explicitement des sauts de ligne en HTML (4.01), sur lesquels l'arborescence DOM et la valeur en direct de la zone de texte sont basées sur: w3.org/TR/html4/struct/text.html #whitespace
PointedEars
5
@PointedEars Oui, mais la sérialisation HTML ne se produit pas lors de la définition .valuedynamique de la zone de texte , par exemple textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Mais c'est probablement un cas de bord - comme je l'ai dit, dans la plupart des cas, votre expression régulière est suffisante.
Mathias Bynens
2
@MathiasBynens Parce que U + 2028 et U + 2029 ne constituent pas des sauts de ligne en HTML (4.01), cette affectation n'affiche pas deux lignes dans la zone de texte avec une implémentation DOM et un moteur de mise en page majeurs. Donc, personne sensé ne ferait une telle mission en premier lieu.
PointedEars
1
J'ai dû échapper à la barre oblique inverse pour que cela fonctionne pour moi, c'est-à-dire textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 encore. Merci
Crab Bucket
513

La façon dont vous trouveriez un saut de ligne varie selon les encodages du système d'exploitation. Windows le serait \r\n, mais Linux utilise simplement \net Apple utilise \r.

J'ai trouvé cela dans les sauts de ligne JavaScript :

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

Cela devrait supprimer toutes sortes de sauts de ligne.

Ermite
la source
19
Pourquoi avoir le séparé \r\n et \n et \r mieux que juste /[\n\r]/g? Cela est sûrement plus lent qu'il ne devrait l'être, car il suffit de comparer chaque personnage avec l'ensemble des deux options possibles.
Fin du codage
2
Lors de l'analyse, les données renvoyées par memcached dans node.js en utilisant / [\ n \ r] / g ont fait l'affaire pour moi. Merci allé codage! L'option dans la réponse l'a massacrée.
Kyle Coots
111

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

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

String.trim() supprime les espaces au début et à la fin des chaînes ... y compris les sauts de ligne.

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!!!"

Voici un exemple de violon: http://jsfiddle.net/BLs8u/

REMARQUE! il ne coupe que le début et la fin de la chaîne, pas les sauts de ligne ni les espaces au milieu de la chaîne.

RobW
la source
34
Cela supprime uniquement les sauts de ligne du début et de la fin de la chaîne. OP a demandé comment supprimer TOUS les sauts de ligne.
Ian Walter
4
Oui, juste en ajoutant en option.
RobW
1
A travaillé pour ce dont j'avais besoin - début et fin de chaîne. Merci!
Harlin
47

Vous pouvez utiliser \ndans une expression régulière pour les retours à la ligne et \rpour les retours chariot.

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

Différents systèmes d'exploitation utilisent différentes fins de ligne, avec des mélanges variés de \net \r. Cette expression régulière les remplacera tous.

Kendall Frey
la source
Je pense que cela ne remplacera que la première occurrence
Sebas
5
/\n|\r/gest écrit plus efficacement /[\n\r]/gou même /[\n\r]+/g. Évitez l'alternance, sauf si vous en avez absolument besoin.
PointedEars
Je ne sais pas si c'est une plainte. Il fait ce que j'ai dit: supprimez TOUT ce qui n'est pas dans cette plage HEX. Les caractères qui dépendent du jeu de caractères bien sûr, mais ce post était sur ASCII.
masi
22

Si vous souhaitez supprimer tous les caractères de contrôle, y compris CR et LF, vous pouvez utiliser ceci:

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

Il supprimera tous les caractères non imprimables. Ce sont tous des caractères qui NE SONT PAS dans l'espace ASCII HEX 0x20-0x7E. N'hésitez pas à modifier la gamme HEX selon vos besoins.

masi
la source
2
Cela supprimera également certains caractères nationaux des langues autres que l'anglais ....
smentek
21

La solution la plus simple serait:

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()avec /\s+/gregexp change tous les groupes de caractères d'espaces blancs en un seul espace dans la chaîne entière, puis nous avons .trim()pour résultat de supprimer tous les espaces blancs excédants avant et après le texte.

Sont considérés comme des espaces blancs:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

Freezystem
la source
Génial, mais je le fais fonctionner en réaffectant la variable:str = str.replace(/\s+/g, ' ').trim();
Fred K
15
var str = "bar\r\nbaz\nfoo";

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

>> "barbazfoo"
Gordon Freeman
la source
15

Pour supprimer les nouveaux caractères de ligne, utilisez ceci:

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

Ensuite, vous pouvez couper votre chaîne pour supprimer les espaces de début et de fin:

yourString.trim()
Si7ius
la source
6

La réponse fournie par PointedEars est tout ce dont la plupart d'entre nous ont besoin. Mais en suivant la réponse de Mathias Bynens, je suis allé sur Wikipédia et j'ai trouvé ceci: https://en.wikipedia.org/wiki/Newline .

Ce qui suit est une fonction drop-in qui implémente tout ce que la page Wiki ci-dessus considère comme "nouvelle ligne" au moment de cette réponse.

Si quelque chose ne correspond pas à votre étui, retirez-le simplement. De plus, si vous recherchez des performances, ce n'est peut-être pas le cas, mais pour un outil rapide qui fait le travail dans tous les cas, cela devrait être utile.

// 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
la source
3
Premièrement - pour les personnes ne trouvant pas JS - "la plupart" des versions de RE prennent en charge \Rce qui est "tous" les sauts de ligne. Deuxièmement - pourquoi pas simplementsomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan
@ClasG, vous faites valoir un bon argument. Je pense que ma façon de penser lorsque j'ai écrit cela était de ne courir que replace()pour le lineTerminatorsqui existait dans la chaîne pour des raisons de performances.
futz.co
5

Un saut de ligne dans l'expression régulière est \ n, donc votre script serait

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

J'ajoute ma réponse, c'est juste un addon à ce qui précède, car pour moi j'ai essayé toutes les options / n et cela n'a pas fonctionné, j'ai vu que mon texte venait du serveur avec une double barre oblique alors j'ai utilisé ceci:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');
chaya D
la source
5

UTILISEZ CETTE FONCTION CI-DESSOUS ET FACILITEZ VOTRE VIE

L'approche la plus simple consiste à utiliser des expressions régulières pour détecter et remplacer les sauts de ligne dans la chaîne. Dans ce cas, nous utilisons la fonction replace avec une chaîne à remplacer, qui dans notre cas est une chaîne vide.

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

Dans l'expression ci-dessus, g et m sont pour les drapeaux globaux et multilignes

vishu2124
la source
2

Essayez le code suivant. Il fonctionne sur toutes les plateformes.

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
la source
0

Sur mac, utilisez simplement \ndans regexp pour faire correspondre les sauts de ligne. Ainsi, le code sera string.replace(/\n/g, ''), ps: le g suivi signifie correspondre à tous au lieu de simplement le premier.

Aux fenêtres, ça le sera \r\n.

kobako
la source