Cómo verificar si una línea está en blanco usando regex

154

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
Adnan
fuente
Aquí en blanco significa lo que quiere decir. Una línea contiene espacios en blanco o una línea no contiene nada. Si desea hacer coincidir una línea que no contiene nada, use '/ ^ $ /'
Badri Gs

Respuestas:

329

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.

Referencias


Una alternativa no regex:

También puede verificar si una cadena dada lineestá "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 matchesse define en Java) de la siguiente manera:

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

Referencias API

poligenelubricantes
fuente
1
@Adnan: toma nota del comentario de Bart en la respuesta de Marcelo; dependiendo de cómo desee manejar múltiples líneas en blanco, el patrón puede cambiar ligeramente.
polygenelubricants
Bueno, estoy leyendo un archivo de Java, línea por línea, así que supongo que esto estará bien.
Adnan
1
eso parece brillante con line.trim: D
Adnan
1
excelente, los códigos ahora se ejecutan de 1.6sec a> 1sec Gracias.
Adnan
en python: if line.strip(): dado que una cadena vacía se evalúa comoFalse
John Mark
58

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).

bchr02
fuente
Exactamente, y confirmó que este es el caso. La respuesta aceptada perdió muchas líneas vacías en mi archivo, pero esto las atrapó a todas. La unión de ambas expresiones regulares atrapa todos los casos.
elmor
1
Esta respuesta funcionó perfectamente en una herramienta como Notepad ++. La respuesta aceptada coincidió con varias líneas vacías pero no con una sola línea vacía.
James
En mi caso, la respuesta aceptada no funciona en Sublime Text 3, y esto funciona.
yangsibai
1
La respuesta aceptada funcionó para mi caso, multilíneas. Esto hace.
Robert Gabriel
1
Esta debería ser la mejor respuesta.
Q i
12

Prueba esto:

^\s*$
Marcelo Cantos
fuente
55
@Adnan, tenga en cuenta que \stambié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.
Bart Kiers
6

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 \ty \ncon tabulación y nueva línea en consecuencia) y [^ \n\t]hacer coincidir una cadena que no sea un espacio en blanco.

soulmerge
fuente
Al menos cambiaría el espacio individual con la clase[ \t]
Bart Kiers
1
En Windows también debe tener en cuenta el carácter de retorno de carro \rpara 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*$
ps.pf
5

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.

John Henry
fuente
¿Por qué no comentar la respuesta de bchr02 y sugerir la mejora de su respuesta?
adamlogan
1
@adamlogan sí, de memoria, creo que quería hacerlo en ese momento, pero no tenía suficiente reputación para comentar sobre la publicación de otra persona, así que tuve que hacerlo así.
John Henry
3

Aquí en blanco significa lo que quiere decir.
Una línea contiene espacios en blanco o una línea no contiene nada.
Si desea hacer coincidir una línea que no contiene nada, use '/ ^ $ /'.

kiruthika
fuente
-1

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

M_TRONIC
fuente
OP quiere una respuesta regex, que se le dio, y no se trata de nuevos caracteres de línea.
Moody_Mudskipper
el usuario solicita una "expresión regular simple que verificará si una línea está en blanco", esta expresión regular (probada en regexpal.com) hace exactamente eso. ¿Por qué no lo pruebas?
M_TRONIC
utilizando R, nuestro vector de prueba: test_vec <- c(" some"," ",""). su solución: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEla solución votado: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. la solución votada da el resultado esperado, la suya no.
Moody_Mudskipper
como dije, usé esto en notepad ++ y funcionó. el tuyo no. ¡así que supongo que podemos estar de acuerdo en no estar de acuerdo!
M_TRONIC
Sin embargo, no estoy muy seguro de lo que estás haciendo, ¿estás haciendo ctrl+fen 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.
Moody_Mudskipper