Expresión regular en MySQL para buscar y sustituir

Iniciado por jdomgo3, 25 Enero 2014, 19:58 PM

0 Miembros y 1 Visitante están viendo este tema.

jdomgo3

Saludos, llevo un rato buscando la manera de hacer una búsqueda de una cadena con caracteres especiales, como por ejemplo, corchetes ([]) y dos puntos(:) en una tabla. Concretamente necesito buscar la siguiente cadena:

Código (txt) [Seleccionar]
[cadena1:1234abdc]

He de decir que la parte "1234abcd" puede variar, es alfanumérica y rándom, en cambio "cadena1" es siempre igual. Por ejemplo:

Código (txt) [Seleccionar]
[cadena1:98u34r7y]

La query que estoy intentando es:

Código (SQL) [Seleccionar]
SELECT * FROM `tabla` WHERE columna REGEXP '\\[cadena1:*\\]';

Pero no me funciona. La segunda parte de lo que necesito hacer es sustituir cualquier coincidencia de [cadena1:*] por [cadena2], así, solo "[cadena2]", sin dos puntos ni nada mas, entre corchetes.

¿Cómo podría hacer esto?



Un saludo y gracias de antemano por la ayuda.

engel lex

si haces...


[cadena1:1234abdc]

el buscara todo lo que tenga por lo menos 1 de los caracteres expresados entre los corchetes...

si quieres  que "cadena:"  sea la parte fija y luego algo variable  seria
cadena\:[a-zA-Z0-9]*

el buscará la frase "cadena:" (por seguridad procura colocarle \ a todos los simbolos que sean fijos, para que el regex sepa que no son codigos)
seguido de uno o mas terminos que contengan simbolos de la "a" la "z", de la "A" a la "Z" o numeros del 0 al 9...


recomendacion... aqui tienes una hoja de codigos de regex...
http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

y aqui para que los pruebes en vivo...
http://regexpal.com/

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

jdomgo3

Cojonudo, me ha funcionado, lo que no se muy bien cómo hacer es la sustitución en todos los casos que encuentre cadena1:[a-zA-Z0-9]* por cadena2, a sin mas, sin dos puntos ni nada mas a su derecha.

He probado con:

Código (SQL) [Seleccionar]
UPDATE `tabla` SET `campo` = REPLACE(`campo`, cadena1\:[a-zA-Z0-9]*, cadena2);

pero no me funciona  :-\

engel lex

Lee la hojas de expresiones rwgulares eso es un poco mas complicado... no es mas facil que lo hagas en PHP o tienes que hacerlo en mysql puro?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

EFEX

La function replace no soporta expresiones regulares y creo que no existe funcion mysql que lo soporte.
GITHUB 

jdomgo3

Cita de: engelx en 25 Enero 2014, 23:15 PM
Lee la hojas de expresiones rwgulares eso es un poco mas complicado... no es mas facil que lo hagas en PHP o tienes que hacerlo en mysql puro?

Es en MySQL puro, no es nada PHP. Gracias de todos modos, seguiré mirando a ver si hay algo. Y si no un export, un awk o sed de toda la vida y un import, pero esa será mi última opción.

jdomgo3

Cita de: EFEX en 25 Enero 2014, 23:43 PM
La function replace no soporta expresiones regulares y creo que no existe funcion mysql que lo soporte.

Gracias EFEX, seguiré mirando a ver si encuentro alguna cosa que me sirva.

#!drvy


EFEX

GITHUB 

jdomgo3

Drvy y EFEX, muchas gracia a los dos, llamadme cateto pero... no se muy bien cómo adaptar esta función y su invocación a mis datos, arrgggg. Mi tabla se llama prueba, la columna se llama col1 y he de cambiar el string hola:98yef8y por el string adios:

Código (SQL) [Seleccionar]
DELIMITER $$
CREATE FUNCTION  `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000))

RETURNS VARCHAR(1000)
DETERMINISTIC
BEGIN
DECLARE temp VARCHAR(1000);
DECLARE ch VARCHAR(1);
DECLARE i INT;
SET i = 1;
SET temp = '';
IF original REGEXP pattern THEN
  loop_label: LOOP
   IF i>CHAR_LENGTH(original) THEN
    LEAVE loop_label; 
   END IF;
   SET ch = SUBSTRING(original,i,1);
   IF NOT ch REGEXP pattern THEN
    SET temp = CONCAT(temp,ch);
   ELSE
    SET temp = CONCAT(temp,replacement);
   END IF;
   SET i=i+1;
  END LOOP;
ELSE
  SET temp = original;
END IF;
RETURN temp;
END$$
DELIMITER ;

SELECT * FROM  `prueba` WHERE col1 regex_replace('hola\:[a-zA-Z0-9\-]*','','adios');


No me está funcionando, no creo que lo esté haciendo bien, pero es que no controlo muy bien esto de las funciones en SQL.