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

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


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


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*$

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.


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.


¿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 '/ ^ $ /'.


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.