Ayuda con StringRegExpReplace

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Ayuda con StringRegExpReplace

Mensaje por avechuche »

Ximorro escribió:Bueno, de experto nada, es que me tocaba los huevs que no salía y me encabezoné :smt003

Por cierto avechuche, has puesto esto en el foro de "Preguntas sencillas" ¿¿y mira la que has armado?? :smt005

Usa el código que te parezca mejor, pero no hace falta que te diga cuál usaría yo, ¡todo eso en una línea! ;-)

Y un momento, ¿dices que el código de Chefito es parecido al que tenías? ¡¿Tenías un código y no nos lo has puesto para que tengamos algo con lo que empezar?! :smt018

Creo que luego haré pruebas de velocidad, no es relevante porque se va a usar en cadenas pequeñas pero por curiosidad, para saber si las expresiones regulares son más rápidas que el código desarrollado. Supongo que sí más que nada porque el procesamiento de la expresión regular corre en C compilado...

¿UN ERROR? Bueno creo que yo ya paro y más si no vas a usar la expresión regular pero dinos qué es, tengo curiosidad en saber en qué falla...

Estoy ansioso de ver el programa, tiene pinta de ser muy interesante, y más para los que estén estudiando estas cosas.
Además con esa idea se podrían hacer otras cosas, a lo mejor algo parecido para simplificar expresiones aritméticas o algo así.

Si verdad, no era para nada sencilla. Jajajaja

Si tenia con code, pero no lo vi relevante son dos For que recorren un array comprobando, nada mas raro que eso.

Lo que falla es lo siguiente (Ojo que es una modificacion mia) por eso no anda :smt010 :smt010 :smt010 :smt010 :smt010 :smt010

Código: Seleccionar todo

$res = StringRegExpReplace($cadena, "(\()?(-[[:alnum:]]\^-[[:alnum:]])(?(1)\))", "($2)")
$res = StringRegExpReplace($res, "(\()?([[:alnum:]]\^-[[:alnum:]])(?(1)\))", "($2)")
Lo que hago es poner parentesis cuando encuentra "-0^-0", quedando "(-0^-0)" por ejemplo.
Ahora si en la misma $Cadena ademas de tener "-0^-0" hay "0^-0", quiero que ponga "(0^-0)", quedando $Cadena = (-0^-0)v(0^-0)

Pero aqui el problema como la segunda condicion es "parecida" a la primera, me deja la cadena asi "(-(0^-0))v(0^-0)" y asi con todas las combinaciones que se den. Quise arreglarlo con @extended, pero no tmp. Al final trate de reducir lo que ya tenia, los primitivos "For" :).

Igual voy a leer lo de StringRegExpReplace para seguir achicando lo que mas se pueda.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda con StringRegExpReplace

Mensaje por Ximorro »

¡Entonces no me digas que tenía un error! El error está en una modificación, no en lo que yo hice...

Quizás no he comprendido plenamente lo que quieres, ¿pero esta única línea no lo solucionaría?
$cadena = "-0^-0v0^-0"
$res = StringRegExpReplace($cadena, "(\()?(-?[[:alnum:]]\^-[[:alnum:]])(?(1)\))", "($2)")

Esto devuelve "(-0^-0)v(0^-0)"
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Ayuda con StringRegExpReplace

Mensaje por avechuche »

No me retes!! :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010 :smt010

aca la solucion "definitiva" (quien sabe mas adelante se podra modificar :smt040 :smt040 :smt040 :smt040 :smt040 :smt040 :smt040 :smt040 :smt040 )

$cadena = "-0^-0 v 0^-0 v -0^0 v 0^0"
$res = StringRegExpReplace($cadena, "(\()?(-?[[:alnum:]]\^-?[[:alnum:]])(?(1)\))", "($2)")
ConsoleWrite($res & @CRLF)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda con StringRegExpReplace

Mensaje por Ximorro »

Que no te retoooo, ni me meto contigo ni nada.
Que está muy bien que intentes modificar lo que hay para hacer otras cosas, eso está muy bien y te animo a hacerlo.
Pero es que me dijiste que "casi iba" que había un pequeño error, y yo intentando averiguar en qué me fallaba, y resulta que fallaba en una versión modificada que ni siquiera conocía, hombre, ¡eso no se hace!

Si no te aclaras con las expresiones regulares (que más vale que te leas la ayuda y aún así...) pues puedes coger el código de Chefito que es puro Autoit y modificas a partir de ahí.

Ah, por cierto, hice las comparaciones de velocidad. Ejem, resulta que con ER va casi 10 veces más rápido que en puro AutoIt.
Lo curioso es que el método aquel que usa dos ER, una para quitar los paréntesis y otra para volverlos a poner, no es el doble de lenta que la que lo hace a la vez, sólo es un poco más lenta...
Esta es una ejecución procesando esa cadena 10000 veces. Las expresiones procesadas por segundo es independiente del número de ejecuciones (siempre que se hagan suficientes para que haya una medida significativa) así que es una buena comparativa:

Código: Seleccionar todo

Original: (a^p^q^r^t^u)<pvp^qv(p^q)^qv(p^q)^r^s^t^(a^p^r)>a<b<c<d<0>evf^gvh^i^(jvk)vp^p^zv(a^d)^q^(a^b^(cvdve^f))

ER directo: 0.583 s  ->  17149 expresiones por segundo.
((a^p)^(q^r)^(t^u))<pv(p^q)v(p^q)^qv(p^q)^(r^s)^t^((a^p)^r)>a<b<c<d<0>ev(f^g)v(h^i)^(jvk)v(p^p)^zv(a^d)^q^((a^b)^(cvdv(e^f)))

ER en dos pasos: 0.711 s  ->  14059 expresiones por segundo.
((a^p)^(q^r)^(t^u))<pv(p^q)v(p^q)^qv(p^q)^(r^s)^t^((a^p)^r)>a<b<c<d<0>ev(f^g)v(h^i)^(jvk)v(p^p)^zv(a^d)^q^((a^b)^(cvdv(e^f)))

Función AutoIt: 5.528 s  ->  1809 expresiones por segundo.
((a^p)^(q^r)^(t^u))<pv(p^q)v(p^q)^qv(p^q)^(r^s)^t^((a^p)^r)>a<b<c<d<0>ev(f^g)v(h^i)^(jvk)v(p^p)^zv(a^d)^q^((a^b)^(cvdv(e^f)))
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Ayuda con StringRegExpReplace

Mensaje por avechuche »

1) Voy a revivir el tema porque tengo una duda, que parece facil, pero no lo es (?. El tema es asi supogamos que tengo una expresion booleanda asi "p^p", esa expresion, por propiedades quedaria solo "p"; p^p = p. Es posible que mediante ER con StringRegExpReplace pueda hacer ese reemplazo? Seria muy facil se pudiera comparar los grupos $1 y $2 y que si son iguales, reemplaze por $1, pero nose puede o no se como hacerlo.

2) Otra mas. Supongamos que tengo "pp", eso esta mal escrito, no puede haber dos letras seguidas asi sean iguales o diferentes. Lo que yo quiero hacer es mediante ER que si encuentra dos letras seguidas, la segunda la borre.

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

Re: Ayuda con StringRegExpReplace

Mensaje por Dany »

La verdad no entendí. pero si pones un ejemplo de la entrada y la salida que quieres te podria ayudar.

Saludos
  • ............................................Imagen
    ......................................Imagen
Responder