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.
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:
@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.
@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 '/ ^ $ /'.
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
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.
Respuestas:
El patrón que desea es algo como esto en modo multilínea:
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
line
está "en blanco" (es decir, que contiene solo espacios en blanco) altrim()
marcarla y luego verificar si la cadena resultanteisEmpty()
.En Java, esto sería algo como esto:
La solución regex también se puede simplificar sin anclajes (debido a cómo
matches
se define en Java) de la siguiente manera:Referencias API
String String.trim()
boolean String.isEmpty()
true
si, y solo si,length()
es0
.boolean String.matches(String regex)
fuente
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:
La respuesta aceptada:
^\s*$
no coincide con un escenario cuando la última línea está en blanco (en modo multilínea).fuente
Prueba esto:
fuente
\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.fuente
[ \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.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 '/ ^ $ /'.
fuente
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
fuente
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.