Estoy tratando de hacer una expresión regular simple que verifique si una línea está en blanco o no.
Caso;
" some" // not blank
" " //blank
"" // blank
Estoy tratando de hacer una expresión regular simple que verifique si una línea está en blanco o no.
Caso;
" some" // not blank
" " //blank
"" // blank
Respuestas:
El patrón que desea es algo como esto en modo multilínea:
^\s*$
Explicación:
^
es el comienzo del anclaje de cuerdas.$
es el final del ancla de cadena.\s
es la clase de caracteres de espacio en blanco.*
es cero o más repeticiones de.En modo multilínea, ^
y $
también coincide con el principio y el final de la línea.
También puede verificar si una cadena dada line
está "en blanco" (es decir, que contiene solo espacios en blanco) al trim()
marcarla y luego verificar si la cadena resultante isEmpty()
.
En Java, esto sería algo como esto:
if (line.trim().isEmpty()) {
// line is "blank"
}
La solución regex también se puede simplificar sin anclajes (debido a cómo matches
se define en Java) de la siguiente manera:
if (line.matches("\\s*")) {
// line is "blank"
}
String String.trim()
boolean String.isEmpty()
true
si, y solo si, length()
es 0
.boolean String.matches(String regex)
if line.strip():
dado que una cadena vacía se evalúa comoFalse
En realidad, en modo multilínea, una respuesta más correcta es esta:
/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
La respuesta aceptada: ^\s*$
no coincide con un escenario cuando la última línea está en blanco (en modo multilínea).
Prueba esto:
^\s*$
\s
también coincide con los saltos de línea, por lo que no "encontrará" líneas vacías individuales dentro de una cadena que contenga líneas vacías sucesivas.
La expresión regular más portátil sería hacer ^[ \t\n]*$
coincidir una cadena vacía (tenga en cuenta que necesitaría reemplazar \t
y \n
con tabulación y nueva línea en consecuencia) y [^ \n\t]
hacer coincidir una cadena que no sea un espacio en blanco.
[ \t]
\r
para que sea la expresión regular ^[ \t\r\n]*$
. Pero ^\s*$
es mejor, más conciso. Si no desea hacer coincidir las nuevas líneas, puede usar \h
(es decir, espacios en blanco horizontales) como en^\h*$
Crédito completo a bchr02 por esta respuesta . Sin embargo, tuve que modificarlo un poco para captar el escenario para las líneas que tienen */
(final del comentario) seguido de una línea vacía. La expresión regular coincidía con la línea no vacía */
.
Nuevo: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Todo lo que hice fue agregar ^
como segundo carácter para indicar el inicio de la línea.
Bueno ... jugué (usando notepadd ++) y esta es la solución que encontré
\ n \ s
\ n para el final de la línea (donde comienza a coincidir): el cursor no sería de ayuda en mi caso, ya que el comienzo de la fila es una cadena \ s ocupa espacio hasta la siguiente cadena
Espero eso ayude
test_vec <- c(" some"," ","")
. su solución: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE
la solución votado: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE
. la solución votada da el resultado esperado, la suya no.
ctrl+f
en Notepad ++? En este caso, puede encontrar (aunque en realidad no coincide) las líneas en blanco seleccionando el modo de búsqueda "Extendida" y buscando '\ n \ s', si selecciona "Expresión regular", su cadena coincidirá igual, y puede pruebe también la solución de @polygenelubricants. Esta última realmente coincidirá con la línea, puede verificar y ver la diferencia. Le sugiero que edite su respuesta para tener más claro lo que está aconsejando, para que los lectores puedan obtener más valor de ella.