Reemplazar parte de una cadena con expresiones regulares

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Reemplazar parte de una cadena con expresiones regulares

Mensaje por Jonny »

Hola:

Estoy peleándome con una expresión regular que quiero hacer, para reemplazar parte de una cadena, pero no hay manera ;)

Podría procesar los datos línea a línea por ejemplo, y entonces sería más sencillo, en cuanto a la ER; pero requeriría más código y al final, el código para lo que quiero hacer, sería más lioso...

Se trata de leer un archivo, y modificar algunas cosas: Por ejemplo: Eliminar una línea que sólo contenga espacios o tabulaciones; o eliminar los espacios o tabulaciones, delante de una línea que contenga texto (por texto, me refiero a cualquier cosa que no sean espacios en blanco o tabulaciones) o, eliminarlos al final de esta, si los hay.

Para esto, iría muy bien la función StringStripWS() de AutoIt, pero al leer todo el contenido de una vez, con FileRead(), no sirve esta función...

El problema es, que con la ER, consigo eliminar los espacios o tabulaciones, en los casos que menciono arriba, pero también se eliminan los saltos de línea que hay justo antes, o después (que es en lo que me baso mayormente para buscar espacios o tabulaciones).
Pero, no quiero que se eliminen los saltos de línea, sino sólo los espacios y/o tabulaciones, porque de lo contrario, se podrían juntar líneas del contenido del archivo...

He probado a hacer la ER de todas las formas que se me han ocurrido, que no han sido pocas. Pero siempre, el resultado es el mismo...

Por ejemplo, he hecho algo así:

Código: Seleccionar todo

(?:\A|[\r\n]{1})[[:space:]\h\t\v]|[[:space:]\h\t\v](?:[\r\n]{1}|\z)
La coincidencia con inicio de cadena o nueva línea, y nueva línea o fin de cadena, lo pongo en un grupo "no captador", porque entiendo, que al no guardarse en la coincidencia... (pero coincidir) no debería reemplazarse. Pero igualmente, los saltos de línea se reemplazan.

Podría haber sustituido:
(?:[\r\n]{1}|\z)
Por:
(?:\Z)
Pero entonces, no sé por qué: Pero todo lo que haya después de una secuencia de espacios y/o tabulaciones, se elimina (porque en el tercer parámetro de StringRegExpReplace() pongo una cadena vacía ("")).
Entiendo que no debería ser así, porque según la ayuda de AutoIt "\Z" coincide con fin de cadena, o nueva línea... (entiendo, que lo primero que se encuentre). Y si hay una línea en la que únicamente hay por ejemplo espacios, debería coincidir sólo con "nueva línea", si no es la última del archivo que he leído.

También podría haber sustituido:
[[:space:]\h\t\v]
Por:
[[:blank:]]
Pero así, también elimino espacios verticales, si los hubiera ;)

De momento, se me ha ocurrido solucionar esto, añadiendo antes del reemplazo, saltos de línea, a los que ya haya en la cadena. Así, si se elimina uno, no se juntan las líneas... Pero eso es sólo una chapuza para avanzar. :)
Espero que alguien sepa explicarme como hacerlo...

Quizás, sea cosa de que no entiendo muy bien los grupos y los sets... Sé como funcionan, pero no me aclaro mucho con cuando usar uno y otro, más allá, de usar un set ([...]) cuando los carácteres pueden aparecer en cualquier orden, y un grupo, cuando han de aparecer en un orden concreto. Al menos, es lo que entiendo de la ayuda de la función StringRegExp().
Pero en cualquier caso, ni con grupos, ni sin ellos... Siempre se acaban eliminando los saltos de línea, de todas las formas que he probado :)

Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Reemplazar parte de una cadena con expresiones regulares

Mensaje por Dany »

Puedes poner algun ejemplo de entrada y de salida(que quieres)

Saludos
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Reemplazar parte de una cadena con expresiones regulares

Mensaje por Jonny »

No entiendo muy bien lo del ejemplo de entrada/salida.

La idea es leer un archivo, y procesarlo en memoria, para eliminar comentarios (con el carácter #), líneas que sólo contengan espacios y/o tabulaciones, o espacios y/o tabulaciones, al principio de una línea, o al final y reemplazar más de un salto de línea (@CRLF) por uno solo, para dejar únicamente lo que se considera texto, para poder trabajar mejor con el contenido del archivo en memoria.

Por ejemplo, este sería un ejemplo de un archivo a leer:
#Este es un archivo de ejemplo, para ser procesado.
#Aquí pueden haber instrucciones a procesar en memoria, o cualquier otra cosa.

#El programa debe eliminar el formato del contenido del archivo, en memoria.
#El formato del contenido del archivo son: Espacios y/o tabulaciones, en líneas independientes; al principio o final de una cadena válida de texto, o múltiples saltos de línea.





Esta es una línea válida, porque contiene texto. #Una línea de ejemplo.

Esta es otra línea válida, porque también contiene texto.



Esta línea sólo contiene espacios al final.
Después de procesar el contenido del archivo, debería quedar:
Esta es una línea válida, porque contiene texto. #Una línea de ejemplo.
Esta es otra línea válida, porque también contiene texto.
Esta línea sólo contiene espacios al final.
Los comentarios los elimino bien con una ER, pero los espacios no. Además de que si no reemplazo los espacios por un @CRLF se juntan las cadenas que coincidan con el patrón de la ER, resulta que únicamente funciona con la primera coincidencia que encuentra (línea con texto). En las demás, no se eliminan los espacios del principio.

Decía que esto sería más fácil si leyera el archivo por líneas, porque haría el reemplazo en cada línea leída, y eso sí me funciona, porque no hay que trabajar con saltos de línea; pero eso supone más código, que para mí, es innecesario.

Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Reemplazar parte de una cadena con expresiones regulares

Mensaje por Dany »

Se me ocurrio algo asi:

Código: Seleccionar todo

Local $sData=FileRead("1.txt")

ConsoleWrite("!>>Datos Normales" & @CRLF)
ConsoleWrite($sData & @CRLF & @CRLF)

$sData=StringRegExpReplace($sData,"(?m:^)(#).+","")
$sData=StringRegExpReplace($sData,"(?m:^)(\h)*(\r\n|\r|\n)","")

ConsoleWrite("!>>Datos Modificados" & @CRLF)
ConsoleWrite($sData & @CRLF)

Tambien se pueden combinar pero de RegExp se muy muy poco.


saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Reemplazar parte de una cadena con expresiones regulares

Mensaje por Jonny »

Thanks... Miraré a ver que tal.

Yo lo había solucionado con varios reemplazos, pero de forma distinta; porque como decía, con una ER convinada no había forma... Pero lo hice un poco diferente a como lo has hecho tú: Básicamente, partiendo la ER que puse. ;)

Salu2!
Responder