Comment vérifier si une ligne est vide à l'aide de regex

154

J'essaye de faire de simples regex qui vérifieront si une ligne est vide ou non.

Cas;

"    some"   // not blank
"   " //blank
"" // blank
Adnan
la source
Ici Blank signifie ce que vous voulez dire. Une ligne contient plein d'espaces ou une ligne ne contient rien. Si vous voulez faire correspondre une ligne qui ne contient rien, utilisez '/ ^ $ /'
Badri Gs

Réponses:

329

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

^\s*$

Explication:

  • ^ est le début de l'ancre de chaîne.
  • $ est la fin de l'ancre de chaîne.
  • \s est la classe de caractères d'espaces.
  • * est une répétition zéro ou plus de.

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

Références:


Une alternative non-regex:

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

En Java, ce serait quelque chose comme ceci:

if (line.trim().isEmpty()) {
    // line is "blank"
}

La solution regex peut également être simplifiée sans ancres (en raison de la façon dont matchesest définie en Java) comme suit:

if (line.matches("\\s*")) {
    // line is "blank"
}

Références API

lubrifiants polygènes
la source
1
@Adnan: prenez note du commentaire de Bart dans la réponse de Marcelo; selon la façon dont vous souhaitez gérer plusieurs lignes vides, le motif peut changer légèrement.
polygenelubricants
Eh bien, je lis un fichier de Java, ligne par ligne, donc je suppose que ce sera ok.
Adnan
1
qui semble brillant avec line.trim: D
Adnan
1
excellent les codes s'exécute maintenant de 1.6sec à> 1sec Merci.
Adnan
en python: if line.strip(): puisqu'une chaîne vide est évaluée àFalse
John Mark
58

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 lorsque la dernière ligne est vide (en mode multiligne).

bchr02
la source
Exactement, et j'ai confirmé que c'était le cas. La réponse acceptée a manqué de nombreuses lignes vides dans mon dossier, mais cela les a toutes prises. L'union des deux expressions régulières saisit tous les cas.
elmor
1
Cette réponse a parfaitement fonctionné dans un outil tel que Notepad ++. La réponse acceptée correspondait à plusieurs lignes vides mais pas à une seule ligne vide.
james
Dans mon cas, la réponse acceptée ne fonctionne pas dans Sublime Text 3, et cela fonctionne.
yangsibai
1
La réponse acceptée a fonctionné pour mon cas, les multilignes. Cela fait.
Robert Gabriel
1
cela devrait être la meilleure réponse.
Q i
12

Essaye ça:

^\s*$
Marcelo Cantos
la source
5
@Adnan, notez que cela \scorrespond également aux sauts de ligne, donc vous ne "trouverez" pas de lignes vides uniques à l'intérieur d'une chaîne contenant des lignes vides successives.
Bart Kiers
6

L'expression régulière la plus portable serait de faire ^[ \t\n]*$correspondre une chaîne vide (notez que vous devrez remplacer \tet \npar tabulation et nouvelle ligne en conséquence) et de [^ \n\t]faire correspondre une chaîne non-espace.

soulmerge
la source
Je changerais au moins l'espace simple avec la classe[ \t]
Bart Kiers
1
Sous Windows, vous devez également prendre en compte le caractère de retour chariot comme le \rserait le regex ^[ \t\r\n]*$. Mais ^\s*$c'est mieux - plus concis. Si vous ne voulez pas faire correspondre les nouvelles lignes, vous pouvez utiliser \h(c'est-à-dire un espace blanc horizontal) comme dans^\h*$
ps.pf
5

Crédit complet à bchr02 pour cette réponse . Cependant, j'ai dû le modifier un peu pour attraper le scénario pour les lignes qui ont */(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, c'est ajouter ^comme deuxième caractère pour signifier le début de la ligne.

John Henry
la source
Pourquoi ne pas commenter la réponse de bchr02 et suggérer l'amélioration de sa réponse?
adamlogan
1
@adamlogan ouais, de mémoire, je pense que je voulais le faire à l'époque, mais je n'avais pas assez de réputation pour commenter le post de quelqu'un d'autre, alors j'ai dû le faire comme ça.
John Henry
3

Ici Blank signifie ce que vous voulez dire.
Une ligne contient plein d'espaces ou une ligne ne contient rien.
Si vous voulez faire correspondre une ligne qui ne contient rien, utilisez '/ ^ $ /'.

Kiruthika
la source
-1

Eh bien ... j'ai bricolé (en utilisant notepadd ++) et c'est la solution que j'ai trouvée

\ n \ s

\ n pour la fin de la ligne (où vous commencez la correspondance) - le signe d'insertion ne serait pas utile dans mon cas car le début de la ligne est une chaîne \ s prend n'importe quel espace jusqu'à la chaîne suivante

J'espère que ça aide

M_TRONIC
la source
OP veut une réponse regex, qui a été donnée, et ne concerne pas les caractères de nouvelle ligne.
Moody_Mudskipper
l'utilisateur demande une "expression régulière simple qui vérifiera si une ligne est vide", cette expression régulière (testée sur regexpal.com) fait exactement cela. pourquoi ne pas le tester?
M_TRONIC
en utilisant R, notre vecteur de test: test_vec <- c(" some"," ",""). votre solution: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEla solution Voté: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. la solution votée donne le résultat attendu, la vôtre non.
Moody_Mudskipper
comme je l'ai dit, je l'ai utilisé sur notepad ++ et cela a fonctionné. le vôtre ne l'a pas fait. donc je suppose que nous pouvons être d'accord pour ne pas être d'accord!
M_TRONIC
Je ne suis pas vraiment sûr de ce que vous faites, faites-vous ctrl+fdans notepad ++? Dans ce cas, vous pouvez trouver (mais pas vraiment correspondre) les lignes vides en sélectionnant le mode de recherche «Étendu» et en recherchant «\ n \ s», si vous sélectionnez «Expression régulière», votre chaîne correspondra de la même manière, et vous pouvez essayez également la solution de @polygenelubricants. Cette dernière correspondra vraiment à la ligne, vous pouvez vérifier et voir la différence. Je vous suggère de modifier votre réponse pour être plus claire sur ce que vous conseillez, afin que les lecteurs puissent profiter davantage de it.
Moody_Mudskipper