Página 1 de 1
Problemas con Expresiones Regulares
Publicado: 16 Ene 2012, 19:14
por Percy
Hola a todos:
Necesito ayuda con expresiones regulares :
Estoy leyendo un archivo desde AutoIt, dentro de las lineas tengo que hacer unas correcciones utilizando expresiones regulares
$file_read = StringRegExpReplace ($file_read, $busca, $reempplaza, $ocurrencias )
busca correctamente, pero cuando reemplaza tiene problemas para usar las expresion regular: \n
debe buscar = <A'=´B>
debe reemplazar por = <A>\n<B>
es una expresion muy sencilla y no se porque no lo hace bien, en vez de reemplazar por un salto (\n), solo reemplaza el salto por (n)
aqui como lo reemplaza: <A>n<B>
Por favor no se que estoy haciendo mal o hay algo mas que configurar...
Re: Problemas con Expresiones Regulares
Publicado: 16 Ene 2012, 20:19
por jamaro
Bienvenido Percy.
¿quizás si pones \\n se te soluciona el problema ?
Re: Problemas con Expresiones Regulares
Publicado: 16 Ene 2012, 21:45
por Percy
Pues he probado eso de "\\n" pero no funciona
Re: Problemas con Expresiones Regulares
Publicado: 16 Ene 2012, 21:57
por arkcrew
Y esto?
debe buscar = <A'=´B>
debe reemplazar por = <A>\n<B>
Porque no haces, stringreplace("<A'=´B>","\n") asi acabas antes no?
Saludos!
Re: Problemas con Expresiones Regulares
Publicado: 17 Ene 2012, 15:00
por Jonny
Yo creo, que no funciona porque Ximorro ha comentado alguna vez, que aunque PCRE está compilado con AutoIt con soporte Unicode, no parece funcionar, y "´" ¿no es Unicode?.
Quizá como han dicho, con stringReplace sea más sencillo...
¿El "\n" por el que quieres reemplazar, ha de ser literal, o lo que quieres es poner un salto de línea?. Porque si es esto último ... así no te va a funcionar :). Debería ser un @LF.
Salu2!
Re: Problemas con Expresiones Regulares
Publicado: 17 Ene 2012, 15:23
por Jonny
Efectivamente, el carácter que decía en el post anterior había que pasarlo a ASCII, y además en la cadena de sustitución hay que poner \\n", para que quede un "\n".
El carácter sigue estando en Unicode en la cadena que busca la coincidencia, pero en la ER se le pasa como ASCII, y parece que funciona.
Prueba esto, a ver que tal.
Código: Seleccionar todo
$Var="Hola = <A'=´B> esto es una cadena a reemplazar"
$Var=StringRegExpReplace($Var, "(= <A'=\xB4B>)", "= <A>\\n<B>", 0)
MsgBox(0, "", $Var)
Tal como está, reemplaza todas las coincidencias. Si necesitas que sólo reemplace una, dos ... o las que sean, modifica el tercer parámetro de StringRegExpReplace() por el valor que quieras.
Salu2!
Re: Problemas con Expresiones Regulares
Publicado: 18 Ene 2012, 12:07
por Ximorro
Percy lo que tenías que haber hecho es ponernos tu StrStringRegExpReplace, para ver si encontrábamos algún problema, ya que por lo que dices lo tienes hecho.
Es más fácil casi siempre partir de algo que empezar de cero, así compartimos conocimientos y aprovechamos el tiempo que tú ya te has pegado con ello.
Dicho esto, aquí hay dos partes:
1) La cadena a sustituir, el $busca, ciertamente no queda claro lo de esas comitas, que la segunda parece un acento suelto, ¿eso es correcto?
De todas maneras por lo que veo ahí no tienes problemas, porque sustituirte te sustituye, lo que pasa es que esa sustitución no te la hace como quieres. Así que en principio supongo que esa parte está bien.
2) La sustitución, el $reemplaza, la primero que tenemos que tener en cuenta es que ESTA CADENA NO ES UNA EXPRESIÓN REGULAR, aunque tiene algunas particularidades que hacen que el carácter "\" no se comporte tampoco como un literal.
Para empezar no tenemos del todo claro si quieres poner los caracteres literales "\n" o una nueva línea. Yo creo que te refieres a lo segundo pero explico las dos.
Si fuera un literal sería con "<A>\\n<B>" como te ponen los compañeros, pero no es porque sea una expresión regular, sino porque en la cadena de sustitución la barra invertida se usa para hacer referencia a grupos capturados en la expresión regular. Si después de la barra no va un número estoy de acuerdo de que o debería dar un error o ponerla tal cual, pero por lo visto es equivalente a \0, así que sustituye por una cadena vacía y te queda la n. Así que hay que poner la doble barra para que escriba el texto "\n"
Pero creo que no quieres un literal, pues dices que quieres "usar las expresion regular: \n", como en expresiones regulares eso es un carácter "linefeed" o "salto de línea", en AutoIt un @LF, creo que quieres poner eso.
Entonces tienes que poner el carácter ASCII 10, pero repito: la cadena que sustituye NO es una expresión regular, así que \n no es un linefeed. Como te indicaba Jonny tienes que usar la macro de AutoIt @LF (o bien poner el carácter con su ASCII con la función CHR(10):
"<A>" & @LF & "<B>"
Debes tener en cuenta otra cosa, y es que depende de para qué es esa "nueva línea", porque @LF es lo usado en sistemas UNIX, pero si es para Windows/DOS los normal es usar para nueva línea un "retorno de carro + salto de línea" que son los caracteres ASCII 13 y 10, en autoIT se pueden poner independientemente como @CR y @LF y juntos como @CRLF.
Para llevar la contraria, en Mac se usa únicamente el carácter @CR.
Para web creo que la norma (estoy seguro en ftp y creo que en http es igual) es que se use el formato MSDOS: @CRLF (aunque los navegadores están preparados para encontrarse con sólo el @LF)
Así que probablemente lo que quieres usar es:
"<A>" & @CRLF & "<B>"
Ya nos dices.
Por cierto, respecto a las ocurrencias a reemplazar, si no se pone nada es equivalente a sustituirlas todas.