PDA

Ver la Versión Completa : Ejercicios de verano (datos entre las dos primeras repeticiones)


WillyWeb
30/06/18, 11:17:54
La amiga Viki es una mina de oro. Esta vez la Taskera tiene una consulta de lo más peregrina ... :oh:

Tengo esta lista de palabras...

(,search,movie,mayapur,search,movie1,mayapur2,sear ch,movie3,maya,pur,search,movie,mylapore,search,mo vie,mayapuri,search,movei,mayapur,)

¿Podría alguien ayudarme a encontrar los datos entre las dos primeras palabras repetidas?

En este caso la primera palabra que se repite es "search" y el resultado debería ser (movie mayapur) sin las comas.

Viki no sabe nada de JS y no lo quiere ver ni en pintura, así que solamente vale Tasker puro. :silbando:

WillyWeb
02/07/18, 10:16:15
Parece que este "ejercicio" se nos está resistiendo. Y no lo entiendo porque no tiene tanta complicación. :oh:

El proceso "manual"...

-Saco la primera palabra de la lista y compruebo si se repite
-Si no se repite vuelta al principio
-Si lo hace extraigo las palabras entre sus dos primeras apariciones

El proceso "automático" ...

Entre2Repes (666)
A1: Establece Array [ Matriz de Variables (array):%lst Values:,search,movie,mayapur,search,movie1,mayapur 2,search,movie3,mayapur,search,movie,mylapore,sear ch,movie,mayapuri,search,movei,mayapur, Separador:, ]
<SACA PALABRA>
A2: Array Pop [ Matriz de Variables (array):%lst Posición:1 A la variable:%pal ]
A3: Establecer variable [ Nombre:%reps A:%lst(#?%pal) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A4: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:SACA PALABRA ] Si (if) [ %reps = 0 ]
A5: Establece Array [ Matriz de Variables (array):%reps Values:%reps Separador:, ]
A6: Establecer variable [ Nombre:%dats A:%reps1-1 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A7: Establecer variable [ Nombre:%dats A:%lst(1:%dats) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A8: Flash [ Texto:%pal / %reps / %dats Largo:Encendido ]

El proceso no tiene en cuenta dos cosas ...

-Que no existan palabras duplicadas
-Que no existan datos entre las repeticiones

¿Alguien lo arregla? :silbando:

GraphicAdventure
02/07/18, 20:53:19
Basta saber cuando termina de verificar todo.
Y con regex lo tenemos con 1 acción. ;-)

WillyWeb
03/07/18, 10:31:06
Basta saber cuando termina de verificar todo.
Y con regex lo tenemos con 1 acción. ;-)

Muero de ganas de comparar nuestras soluciones. :silbando:

GraphicAdventure
03/07/18, 22:23:01
En A4 añadir la condición: AND %lst(#) neq 0

Tengo una duda con una situación.
¿Si el texto es a,b,b,c,b, no tiene que mostrar nada o tiene que mostrar b,c?
Es que con regex me encuentra b,c y no veo forma de que no salga nada.

WillyWeb
04/07/18, 07:53:38
En A4 añadir la condición: AND %lst(#) neq 0

Si haces eso la tarea pasará a A5 cuando la lista de palabras se quede vacía exactamente igual que si en A3 se hubiese encontrado una repetición.

¿Es eso lo que querías hacer?
¿Has valorado las implicaciones?

¿Si el texto es a,b,b,c,b, no tiene que mostrar nada o tiene que mostrar b,c?

En ese caso la primera repetición es ... ,a,b,b,c,b, ... y lo correcto sería no devolver nada.

Es que con regex me encuentra b,c y no veo forma de que no salga nada.

Seguro que eso se puede solucionar cambiando "un poco" el regex. :pensando:

GraphicAdventure
04/07/18, 10:31:15
¿Es eso lo que querías hacer?
¿Has valorado las implicaciones?

Si hay implicaciones ahora mismo no las veo.
Si no hay repeticiones pasa a A5 y %dats no devuelve nada que es lo que interesa saber.
Si no hay datos entre repeticiones, lo mismo.


Seguro que eso se puede solucionar cambiando "un poco" el regex.

Ya di varios planteamientos pero no cubre todas las posibilidades.
No estoy seguro que sea posible.
Intentaré empezar de cero.

WillyWeb
04/07/18, 12:20:58
Si no hay repeticiones pasa a A5 y %dats no devuelve nada que es lo que interesa saber.
Si no hay datos entre repeticiones, lo mismo.

Pues ya es casualidad que el resultado sea el esperado. Pero de pura casualidad. :silbando:

Ya di varios planteamientos pero no cubre todas las posibilidades.

No tengo muy claro lo que estás intentando. Sacar el texto entre dos repeticiones, teniendo ya localizada la palabra repetida, es cosa fácil, pero tengo la sensación de que quieres dar con una expresión que lo haga todo de una vez ¿...?

GraphicAdventure
04/07/18, 13:06:05
Pues ya es casualidad que el resultado sea el esperado. Pero de pura casualidad.

Solo veo 3 supuestos:
- Hay repetición con datos
- Hay repetición sin datos
- No hay repetición

Esta condición cubre esto y sin ella se queda un bucle interminable.
No sé cuál es la situación que dices que no va a funcionar. Puede que no vea alguna.

Sobre el regex es una expresión que cubra estos 3 supuestos.
El problema es el ,a,b,b,c,b,

WillyWeb
04/07/18, 13:38:13
Cuando te digo que es casualidad que la tarea haga lo esperado en esos tres supuestos es porque no era mi intención que fuese así. Simplemente hice una "traducción" casi literal del proceso manual al automático sin mirar nada más.

No le des más vueltas. Añadiendo la condición que has propuesto ya no existe posibilidad de que se quede en un bucle sin salida. Esa parte está resuelta.

Y eso también soluciona mi segundo escenario no previsto (repetición sin datos) ... %dats no devuelve nada.

Algunas veces me asusto de lo finas que me salen las tareas, hasta sin querer afinarlas ... :risitas:

Sobre el regex es una expresión que cubra estos 3 supuestos.
El problema es el ,a,b,b,c,b,

Entonces tu intención es hacer una expresión que resuelva el problema de una tacada y se te está resistiendo ese caso en concreto ¿...?

Pues regex no es que sea mi fuerte, pero si te puedo ayudar deja caer por aquí esa expresión y le damos vueltas. :pensando:

GraphicAdventure
05/07/18, 11:00:23
No le des más vueltas.

Me hiciste buscar los tres pies al gato. :loco: :D


Tuve que hacer 2 expresiones:


A1: Establecer variable [ %lista ,ant,bar,bar,ant2,ant3,bar, ]
A2: Buscar y Reemplazar [ %lista (?=,(.+?),).+?(?=,\1,) ] Una sola coincidencia:Encendido ; Almacenar Coincidencias En:%aaa
A3: Buscar y Reemplazar [ %aaa1 ,.+?[^,]+,? ] Si (if) [ %aaa1 Ajuste ] Una sola coincidencia:Encendido ; Reemplazar Coincidencias:Encendido ; Reemplazar Con:
A4: Flash [ Texto:%aaa1 ]

WillyWeb
05/07/18, 12:28:39
Supongo que en la segunda A2 la variable es %aaa1 en vez de %lista ... ¿no? ;-)

Al margen de eso, excelente uso de regex. :ok:

Por cierto, podías explicar el funcionamiento de esos grupos de captura que has usado. Dan mucho juego y seguro que te lo agradecen.

GraphicAdventure
05/07/18, 13:10:41
Me olvidé de poner los parámetros de las acciones y después los añadí.
La segunda variable de A2 es %aaa, al guardar se queda %aaa1.

WillyWeb
05/07/18, 13:18:49
Revisa la tarea porque tiene dos acciones A2. Y además, en la segunda A2 (que debería ser A3) has usado %lista y seguramente querías poner %aaa1.

GraphicAdventure
05/07/18, 13:23:43
¡Ah! Copié el texto de A2 y con él la %lista. Corregido.

GraphicAdventure
05/07/18, 14:29:33
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/RegExp

Quien quiera manejar regex con Tasker, tiene aquí en español los caracteres especiales que hay que aprender.
Hay detalles que no están como lookbehind.
Voy a mencionar el caso que comenta WillyWeb.

Quando se pone algo entre paréntesis en una expresión, ese algo se queda definido como un grupo secuencialmente: (a) (b) (c) ; (a)=grupo1 (b)=grupo2 (c)=grupo3 ...
Si quiero usar la misma información de uno de esos grupos en la propia expresión, pongo \n donde n es el número del grupo.
Si quiero reemplazar la información encontrada en la búsqueda con la de uno de esos grupos, en 'Reemplazar Con' pongo $n donde n es el número del grupo.
En la expresión \n, en reemplazar $n.

Si alguien quiere saber más, mejor abrir tema regex para cualquier consulta pero hay bastante información en la web.

SmartPhoneLover
05/07/18, 14:45:04
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/RegExp

Quien quiera manejar regex con Tasker, tiene aquí en español los caracteres especiales que hay que aprender.
Hay detalles que no están como lookbehind.
Voy a mencionar el caso que comenta WillyWeb.

Quando se pone algo entre paréntesis en una expresión, ese algo se queda definido como un grupo secuencialmente: (a) (b) (c) ; (a)=grupo1 (b)=grupo2 (c)=grupo3 ...
Si quiero usar la misma información de uno de esos grupos en la propia expresión, pongo \n donde n es el número del grupo.
Si quiero reemplazar la información de uno de esos grupos, en 'Reemplazar Con' pongo $n donde n es el número del grupo.
En la expresión \n, en reemplazar $n.

Si alguien quiere saber más, mejor abrir tema regex para cualquier consulta pero hay bastante información en la web.


Muy útil compañero, muchas gracias! ;)

GraphicAdventure
05/07/18, 15:29:09
El texto sobre reemplazar la información no estaba bien.
Lo modifiqué para quedar claro.