web-dev-qa-db-fra.com

Comment puis-je supprimer les espaces blancs de fin à l'aide d'une expression régulière?

Je veux supprimer les espaces et les onglets de fin de mon code sans supprimer les lignes vides.

J'ai essayé:

\s+$

et:

([^\n]*)\s+\r\n

Mais tous ont également supprimé les lignes vides. Je suppose que \s correspond aussi aux caractères de fin de ligne.


MISE À JOUR (2016):

Aujourd'hui, j'automatise ce nettoyage de code en utilisant le package TrailingSpaces de Sublime, avec le paramètre personnalisé/utilisateur:

"trailing_spaces_trim_on_save": true

Il met en surbrillance les espaces et les réduit automatiquement lors de la sauvegarde.

53
ellockie

Essayez simplement de supprimer les espaces et les onglets suivants:

[ \t]+$
102
qbert220

Pour supprimer les espaces blancs de fin tout en préservant les lignes ne contenant que des espaces, vous souhaitez que la regex ne supprime que les caractères de fin de chaîne after autres que des espaces. Vous devez donc d'abord vérifier si un caractère n'est pas un espace. Cela signifie que le caractère non-blanc sera inclus dans la correspondance. Vous devez donc l'inclure dans le remplacement.

Regex: ([^ \t\r\n])[ \t]+$

Remplacement: \1 ou $1, selon l'EDI

26
Koviko

La plate-forme n'est pas spécifiée, mais en C # ( .NET ) ce serait:

Expression régulière (suppose l'option multiligne - l'exemple ci-dessous l'utilise): 

    [ \t]+(\r?$)

Remplacement

    $1

Pour une explication de "\ r? $", Voir Options d’expression régulière, Mode multiligne (MSDN).

Exemple de code complet

Cela supprimera tous les espaces de fin et toutes les tabulations de fin dans toutes les lignes:

string cleanedUpText = Regex.Replace(inputText,
                                     @"[ \t]+(\r?$)", @"$1",
                                     RegexOptions.Multiline);
8
Peter Mortensen

Regex pour trouver des espaces finaux et finaux:

^[ \t]+|[ \t]+$
1
mohanish

Si vous utilisez Visual Studio 2012 et versions ultérieures ( qui utilise des expressions régulières .Net ), vous pouvez supprimer les espaces blancs de fin sans supprimer les lignes vierges à l'aide de l'expression régulière suivante

Remplacer (?([^\r\n])\s)+(\r?\n)

Avec $1

 enter image description here


Quelques explications

La raison pour laquelle vous avez besoin de cette expression plutôt compliquée est que la classe de caractères \s correspond aux espaces, aux tabulations et aux caractères de nouvelle ligne, donc \s+ correspond à un groupe de lignes contenant uniquement des espaces. Cela n'aide pas d'ajouter une terminaison $ à cette expression rationnelle, car cela correspondra toujours à un groupe de lignes contenant uniquement des espaces et des caractères de nouvelle ligne.

Vous voudrez peut-être aussi savoir (comme je l’ai fait) exactement ce que signifie l'expression (?([^\r\n])\s). Ceci est un Alternation Construct , ce qui signifie effectivement une correspondance avec la classe de caractères d'espaces, s'il ne s'agit pas d'un retour à la ligne ou d'un saut de ligne. 

Les constructions d’alternance ont normalement une partie vraie et fausse, 

(?( expression ) yes | no )

mais dans ce cas la fausse partie n'est pas spécifiée.

1
Rob

En Java:



String str = "    hello world  ";

// prints "hello world" 
System.out.println(str.replaceAll("^(\\s+)|(\\s+)$", ""));


0
john smith

[|\t] + $ avec un remplacement vide fonctionne.
\s + ($) avec un remplacement de 1 $ fonctionne également ... au moins dans vscode.

0
Charles Goodwin

Pour supprimer les espaces de fin vides, utilisez ceci:

\n|^\s+\n

J'ai testé dans les éditeurs Atom et Xcode. J'espère qu'il en avait l'habitude.

0
Oskar

Pour supprimer les espaces blancs en fin de texte tout en ignorant les lignes vides, j'utilise une recherche positive:

(?<=\S)\s+$

La recherche est le moyen idéal pour exclure le non-espace (\ S) du match.

0
Markus Strauss

Vous pouvez utiliser l'expression regex /^[ \t\v\f]+\S.*$/gm pour supprimer les espaces de début de ligne, sans toucher aux lignes vierges ni aux espaces de fin:

const str = ' X \n\nY Y\n \n Z'.replace(/^[ \t\v\f]+(\S.*)$/gm, '$1');
console.log(str);
// output: 'X \n\nY Y\n \nZ'

Si vous souhaitez une prise en charge plus robuste bien qu'un peu plus lente, utilisez la fonction regex /^[ \t\v\f\xA0\uFEFF]+(\S.*)$/gm, qui inclut NBSP et BOM, ce qui la rapproche du comportement \s.

AJOUTÉE:

Ceci est plus simple et compatible avec le comportement \s: /^(?=\s+).+(\S.*)$/gm... mais je ne sais pas si cela fonctionnera dans les navigateurs plus anciens.

AVERTISSEMENT: Toute solution basée sur une expression rationnelle simple peut rompre les chaînes ES6 TL.

0
aMarCruz