202 votes

Comment vérifier si une ligne est vide en utilisant regex

Je suis en train de créer une regex simple qui vérifiera si une ligne est vide ou non.

Cas ;

"    some"   // non vide
"   " //vide
"" // vide

1 votes

Voici ce que signifie Blank. Une ligne contient uniquement des espaces ou une ligne ne contient rien. Si vous souhaitez correspondre à une ligne qui ne contient rien, utilisez '/^$/'

430voto

polygenelubricants Points 136838

Le motif que vous voulez est quelque chose comme ceci en mode multiligne :

^\s*$

Explication :

  • ^ est l'ancre du début de la chaîne.
  • $ est l'ancre de fin de chaîne.
  • \s est la classe de caractères espace blanc.
  • * est une répétition de zéro ou plusieurs fois.

En mode multiligne, ^ et $ correspondent également au début et à la fin de la ligne.

Références :


Une alternative sans regex :

Vous pouvez également vérifier si une chaîne donnée ligne est "vide" (c'est-à-dire ne contient que des espaces blancs) en l'enlevant avec trim(), puis en vérifiant si la chaîne résultante isEmpty().

En Java, cela ressemblerait à ceci :

if (line.trim().isEmpty()) {
    // la ligne est "vide"
}

La solution en regex peut également être simplifiée sans ancres (à cause de la façon dont matches est défini en Java) comme suit :

if (line.matches("\\s*")) {
    // la ligne est "vide"
}

Références API

1 votes

@Adnan : prenez note du commentaire de Bart dans la réponse de Marcelo; en fonction de la manière dont vous souhaitez gérer les lignes vides multiples, le schéma peut légèrement changer.

0 votes

Eh bien, je lis un fichier à partir de Java, ligne par ligne, donc je suppose que cela ira bien.

1 votes

Cela semble brillant avec line.trim:D

79voto

bchr02 Points 781

En fait, en mode multiligne, une réponse plus correcte est la suivante :

/(^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

La réponse acceptée : ^\s*$ ne correspond pas à un scénario où la dernière ligne est vide (en mode multiligne).

Édition : ajout d'un ^ vers le début pour capturer le cas des lignes se terminant par */ suivi d'une nouvelle ligne. Merci John Henry.

0 votes

Exactement, et j'ai confirmé que c'est le cas. La réponse acceptée a manqué de nombreuses lignes vides dans mon fichier, mais cela les a toutes attrapées. L'union des deux regex capture tous les cas.

1 votes

Cette réponse a parfaitement fonctionné dans un outil tel que Notepad++. La réponse acceptée correspondait à plusieurs lignes vides mais pas à des lignes vides simples.

0 votes

Dans mon cas, la réponse acceptée ne fonctionne pas dans Sublime Text 3, et ceci fonctionne.

14voto

Marcelo Cantos Points 91211

Essayer ceci :

^\s*$

5 votes

@Adnan, notez que \s correspond également aux sauts de ligne, vous ne "trouverez" donc pas de lignes vides à l'intérieur d'une chaîne contenant des lignes vides successives.

10voto

John Henry Points 63

Tout le crédit va à bchr02 pour cette réponse. Cependant, j'ai dû la modifier un peu pour prendre en compte le scénario des lignes contenant */ (fin de commentaire) suivies d'une ligne vide. Le regex correspondait à la ligne non vide avec */.

Nouveau : (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Tout ce que j'ai fait est d'ajouter ^ comme deuxième caractère pour indiquer le début de la ligne.

0 votes

Pourquoi ne pas commenter la réponse de bchr02 et suggérer l'amélioration de sa réponse?

2 votes

@adamlogan oui, de mémoire, je voulais le faire à l'époque, mais je n'avais pas assez de réputation pour commenter le message de quelqu'un d'autre, donc j'ai dû le faire comme ça.

6voto

soulmerge Points 37314

La regex la plus portable serait ^[ \t\n]*$ pour correspondre à une chaîne vide (notez que vous devriez remplacer \t et \n par tabulation et saut de ligne, respectivement) et [^ \n\t] pour correspondre à une chaîne non blanche.

0 votes

Je changerais au moins l'espace simple avec la classe [ \t]

1 votes

Sur Windows, vous devez également tenir compte du caractère de retour chariot \r donc l'expression régulière serait ^[ \t\r\n]*$. Mais ^\s*$ est meilleure - plus concise. Si vous ne voulez pas prendre en compte les sauts de ligne, vous pouvez utiliser \h (signifiant espace horizontal) comme dans ^\h*$

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X