web-dev-qa-db-fra.com

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

J'ai un texte dans un textarea et je l'ai lu en utilisant l'attribut .value.

Maintenant, j'aimerais supprimer tous les sauts de ligne (le caractère généré 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 regex?

Si ce n'est pas possible, y a-t-il un autre moyen?

364
Wingblade

C'est probablement une FAQ. Quoi qu'il en soit, les sauts de ligne (mieux: nouvelles lignes) peuvent être un retour chariot (CR, \r, sur un Mac plus ancien), un saut à la ligne (LF, \n, sur Unices, y compris Linux) ou CR suivi de LF (\r\n, sous WinDOS). (Contrairement à une autre réponse, cela n'a rien à voir avec l'encodage de caractères.)

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

/\r?\n|\r/

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

/\r?\n|\r/g

respectivement. Continuez ensuite avec la méthode replace comme suggéré dans plusieurs autres réponses. (Probablement vous pas voulez supprimer les nouvelles lignes, mais les remplacer par d'autres espaces, par exemple le caractère d'espace, afin que les mots restent intacts.)

414
PointedEars

La manière dont vous trouvez un saut de ligne varie selon les codages du système d'exploitation. Windows serait \r\n, mais Linux n'utilise que \n et Apple utilise \r.

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

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

Cela devrait supprimer toutes sortes de sauts de ligne.

442
Eremite

String.trim() supprime les espaces du début et de la fin des chaînes ... y compris les nouvelles lignes.

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

94
RobW

Vous pouvez utiliser \n dans une expression régulière pour les nouvelles lignes et \r pour les retours à la ligne.

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

Différents systèmes d'exploitation utilisent différentes extrémités de ligne, avec des mélanges variables de \n et \r. Cette regex les remplacera tous.

39
Kendall Frey

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, "")

Cela supprimera tous les caractères non imprimables. Ce sont tous les caractères ET NON dans l'espace ASCII _ HEX 0x20-0x7E. N'hésitez pas à modifier la plage HEX au besoin.

22
masi

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+/g l'expression rationnelle est en train de changer tous les groupes de caractères d'espaces blancs vers un seul espace dans la chaîne entière, puis nous .trim() le résultat pour supprimer tous les blancs superflus. -espaces avant et après le texte.

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

16
Freezystem
var str = "bar\r\nbaz\nfoo";

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

>> "barbazfoo"
15
Gordon Freeman

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()
13
Si7ius

La réponse fournie par PointedEars est tout ce dont nous avons besoin. Mais en suivant la réponse de Mathias Bynens, j’ai fait un voyage sur Wikipedia et j’ai trouvé ceci: https://en.wikipedia.org/wiki/Newline .

Ce qui suit est une fonction d’ajout 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 vous convient pas, supprimez-le. En outre, si vous recherchez des performances, il se peut que ce ne soit pas le cas, mais que ce soit un outil rapide qui fait le travail de toute façon, 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`)
});
6
futz.co

Un saut de ligne dans regex est\n, votre script serait donc

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

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, '');
2
chaya D

Essayez le code suivant. Cela 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'
2