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.
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:
@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).
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.
@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.
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 */.
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 '/ ^ $ /'.
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
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.
Réponses:
Le motif que vous voulez est quelque chose comme ceci en mode multiligne:
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
line
est "vide" (c'est-à-dire ne contenant que des espaces) en latrim()
-ing, puis en vérifiant si la chaîne résultanteisEmpty()
.En Java, ce serait quelque chose comme ceci:
La solution regex peut également être simplifiée sans ancres (en raison de la façon dont
matches
est définie en Java) comme suit:Références API
String String.trim()
boolean String.isEmpty()
true
si, et seulement si,length()
est0
.boolean String.matches(String regex)
la source
if line.strip():
puisqu'une chaîne vide est évaluée àFalse
En fait, en mode multiligne, une réponse plus correcte est la suivante:
La réponse acceptée:
^\s*$
ne correspond pas à un scénario lorsque la dernière ligne est vide (en mode multiligne).la source
Essaye ça:
la source
\s
correspond é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.L'expression régulière la plus portable serait de faire
^[ \t\n]*$
correspondre une chaîne vide (notez que vous devrez remplacer\t
et\n
par tabulation et nouvelle ligne en conséquence) et de[^ \n\t]
faire correspondre une chaîne non-espace.la source
[ \t]
\r
serait 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*$
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.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 '/ ^ $ /'.
la source
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
la source
test_vec <- c(" some"," ","")
. votre solution:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE
la solution Voté:grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE
. la solution votée donne le résultat attendu, la vôtre non.ctrl+f
dans 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.