regulares - regex r
Reemplazo de múltiples líneas en blanco con una línea en blanco usando RegEx search and replace (10)
Tengo un archivo que necesito para reformatear y eliminar líneas en blanco "adicionales".
Estoy utilizando la función de búsqueda y reemplazo de expresiones regulares de la sintaxis de Perl de UltraEdit y necesito la expresión regular para colocar en el campo "Buscar qué:".
Aquí hay una muestra del archivo que necesito para volver a formatear.
All current text REPLACE with all the following: Winter 2011 Class Schedule Winter 2011 Class Registration Dates: Dec. 6, 2010 – Jan. 1, 2011 Winter 2011 Class Session Dates: Jan. 5 – Feb. 12, 2011 DANCE Adventures in Ballet & Tap 3 – 6 years Instructor: Ann Newby Tots ages 3 – 6 years old develop a greater sense of rhythm, flexibility and coordination as they explore the basic elements of movement. Saturdays 9 - 10 a.m. Jan. 8 – Feb. 12 Six-week fees: $30 African Storytelling 3 – 6 years Instructor: Ann Newby Tots ages 3 – 6 years old explore storytelling and fables through spoken word, music, movement and visual arts experiences. Saturdays 10 – 11 a.m. Jan. 8 – Feb. 12 Six-week fee: $30 African Dance / Children
Notará que algunas de las líneas en blanco dobles tienen espacios o pestañas o ambos en ellas.
Después de que se haya ejecutado la búsqueda y reemplazo, debería tener un archivo como este.
All current text REPLACE with all the following: Winter 2011 Class Schedule Winter 2011 Class Registration Dates: Dec. 6, 2010 – Jan. 1, 2011 Winter 2011 Class Session Dates: Jan. 5 – Feb. 12, 2011 DANCE Adventures in Ballet & Tap 3 – 6 years Instructor: Ann Newby Tots ages 3 – 6 years old develop a greater sense of rhythm, flexibility and coordination as they explore the basic elements of movement. Saturdays 9 - 10 a.m. Jan. 8 – Feb. 12 Six-week fees: $30 African Storytelling 3 – 6 years Instructor: Ann Newby Tots ages 3 – 6 years old explore storytelling and fables through spoken word, music, movement and visual arts experiences. Saturdays 10 – 11 a.m. Jan. 8 – Feb. 12 Six-week fee: $30 African Dance / Children
Depende de cuáles sean los finales de línea. Suponiendo / n, reemplaza esto:
([ /t]*/n){3,}
con /n/n
.
En mi IDI Intellij, lo que buscaba era /n/n
reemplazaba por /n
En vim, utilizando
:%!cat -s
Me parece que esta es la forma más fácil de eliminar una línea extra vacía hasta ahora.
No estoy seguro de qué es lo que UltraEdit le permite salir adelante en el área de "reemplazar", pero si no puede usar una nueva línea (he tenido este problema antes) pero puede usar referencias de captura, esto podría funcionar:
Find : /s*(/r/n)/s*(/r/n)/s*/r/n
Replace : $1$2
No se ha probado ampliamente, pero parece funcionar en la muestra que proporcionó.
Para completar, quiero hacer referencia aquí a la publicación grande Eliminar / eliminar líneas en blanco y vacías en los foros de usuarios de UltraEdit que contiene en la parte inferior, después de todas las explicaciones para novatos, la solución para reducir dos o más líneas sin nada (líneas vacías) o solo espacios en blanco (líneas en blanco) a una línea vacía independiente del tipo de terminador de línea.
Y algunas palabras sobre lo que Alan Moore escribió en su respuesta:
El soporte para expresiones regulares Perl de UltraEdit no está paralizado por su arquitectura basada en líneas. Los motores de expresiones regulares de Perl tienen una marca que determina si un punto coincide con todos los caracteres, excepto los caracteres de nueva línea, como el retorno de carro (CR) y el salto de línea (LF) o, en realidad, todos los caracteres, incluidos CR y LF. Esto hace la diferencia si un archivo de texto se interpreta como un flujo de bytes grande o como una secuencia de líneas para la expresión regular Perl que encuentra / reemplaza. En UltraEdit, el indicador se establece de forma predeterminada para no incluir /r
(CR) y /n
(LF) por un punto en la cadena de búsqueda de expresiones regulares. Pero este comportamiento se puede cambiar fácilmente en UltraEdit iniciando la cadena de expresión regular con (?s)
que cambia el valor de la bandera match_not_dot_newline
como se publicó en los foros de usuarios de UltraEdit en el tema "." en Perl las expresiones regulares no incluyen CRLFs?
Una expresión regular de Perl reemplaza el trabajo para archivos con
- retorno de carro + salto de línea (DOS / Windows) o
- solo avance de línea (Unix, Mac OS 10.0 y versiones posteriores) o
- Solo retorno de carro (Mac OS 9 y versiones anteriores)
como línea que termina con espacios y tabulaciones al final de un párrafo (una o más líneas) y con dos o más líneas sin (línea vacía) o con espacios en blanco (línea en blanco) debajo del párrafo se podría hacer con la cadena de búsqueda /h*(/r?/n|/r)(?:/h*/1){2,}
y /1/1
como cadena de reemplazo.
Explicación:
/h*
coincide con cualquier carácter de espacio en blanco horizontal según Unicode 0 o más veces . Esta primera parte de la expresión de búsqueda coincide con los caracteres de espacios en blanco horizontales al final de una línea, como tabulaciones horizontales, espacios normales, espacios sin interrupción y algunos otros espacios que no se usan con frecuencia.
El uso de /s
no es bueno, ya que esta clase de caracteres coincide con cualquier carácter de espacio en blanco, incluidos el retorno de carro y el salto de línea de caracteres de espacio en blanco vertical.
(/r?/n|/r)
... es una expresión OR con dos argumentos en un grupo de marcado . El primer argumento coincide con un salto de línea opcionalmente con un retorno de carro anterior, mientras que el segundo argumento coincide solo con un retorno de carro. Así que esta expresión coincide con los tres tipos comunes de terminaciones de línea completamente correctas. Es importante que el resto de la búsqueda y el reemplazo coincidan siempre con CR + LF (ambos juntos) o solo LF o solo CR .
(?:/h*/1)
... es un grupo sin marcas que coincide con 0 o más espacios en blanco horizontales y la nueva línea que se encontró antes de la referencia /1
con /1
, es decir, CR + LF o simplemente LF o simplemente CR . Así que esta parte de la expresión encuentra una línea vacía o en blanco.
{2,}
... es un multiplicador para la expresión anterior en el grupo que no marca, lo que significa al menos dos veces . Así que después del final de un párrafo debe haber dos o más líneas vacías o en blanco. Solo una línea vacía o en blanco debajo de un párrafo no es suficiente para una coincidencia positiva de la expresión de búsqueda.
La cadena de reemplazo /1/1
referencia dos veces al primer salto de línea encontrado.
La ventaja de esta expresión regular en comparación con las demás publicadas aquí es que el tipo de final de línea no debe ser conocido. La expresión de búsqueda encuentra que se hace referencia a la línea de salida y se encuentra en la cadena de reemplazo. Y, probablemente, los espacios en blanco finales al final de un párrafo y los espacios en blanco en la siguiente línea también se eliminan con esta expresión regular, reemplazar si hay dos o más líneas vacías o en blanco debajo de un párrafo.
{2,}
puede ser reemplazado por +
en la cadena de búsqueda si el recorte de espacios en blanco al final de un párrafo y en la siguiente línea vacía o en blanco también debe hacerse al ejecutar esta expresión regular de Perl reemplazar. Pero tenga en cuenta que, en este caso, la función de reemplazo sustituye a las que no cambian nada en absoluto si no hay espacios en blanco al final de un párrafo y la siguiente línea es una línea vacía.
Pruebe este perl oneliner perl -00pe0
, si desea editar en su lugar, simplemente agregue la opción -i
Reemplazo
/n/s*/n/s*
con
/n/n
debería hacer el truco
Reemplazo
^(/s*/r/n){2,}
Con
/r/n
Es con lo que terminé.
Esto solo selecciona líneas en blanco en múltiplos de dos o más y las reemplaza por una.
También debe trabajar con espacios en líneas en blanco.
- Buscar - / / n ^ / s * / n /
- Reemplazar - / n / n
Vea este hilo para lo que está causando el problema. Como lo entiendo, las expresiones regulares de UltraEdit son codiciosas en el nivel del personaje (es decir, dentro de una línea), pero no codiciosas en el nivel de la línea (en términos generales). No tengo acceso a la UE, pero intentaría escribir la expresión regular por lo que tiene que coincidir con algo concreto después de la última línea en blanco. Por ejemplo:
search: (/r/n[ /t]*){2,}(/S)
replace: $1$2
Esto combina y captura dos o más instancias de un separador de línea y cualquier espacio en blanco horizontal que lo sigue, pero solo retiene el último. /S
debería obligarlo a seguir coincidiendo hasta que encuentre una línea con al menos un carácter que no sea un espacio en blanco.
Admito que no tengo mucha confianza en esta solución; El soporte de expresiones regulares de UltraEdit está paralizado por su arquitectura basada en líneas. Si desea un editor que se regexea correctamente y no desea aprender una nueva sintaxis de expresiones regulares (como la de vim), obtenga EditPadPro .