J'essaye de faire de simples regex qui vérifieront si une ligne est vide ou non.
Cas;
" some" // not blank
" " //blank
"" // blank
J'essaye de faire de simples regex qui vérifieront si une ligne est vide ou non.
Cas;
" some" // not blank
" " //blank
"" // blank
Réponses:
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 line
est "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 matches
est définie en Java) comme suit:
if (line.matches("\\s*")) {
// line is "blank"
}
String String.trim()
boolean String.isEmpty()
true
si, et seulement si, length()
est 0
.boolean String.matches(String regex)
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:
/((\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).
Essaye ça:
^\s*$
\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.
[ \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.
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
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.