603 votes

Comment faire pour remplacer une expression régulière dans MySQL?

J'ai une table avec ~500k lignes; varchar(255) UTF8 colonne filename contient un nom de fichier;

Je suis en train de dépouiller les divers étranges personnages à partir du nom de fichier - j'ai pensé l'utiliser d'une classe de caractères: [^a-zA-Z0-9()_ .\-]

Maintenant, est-il une fonction MySQL qui vous permet de le remplacer par une expression régulière? Je suis à la recherche d'une fonctionnalité similaire à la fonction de remplacement () - exemple simplifié suivant:

SELECT REPLACE('stackowerflow', 'ower', 'over');

Output: "stackoverflow"

/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-'); 

Output: "-tackover-low"

Je sais que sur les REGEXP/RLIKE, mais ceux-là seulement vérifier si il y a un match, pas ce que le match est.

(Je pourrais faire un "SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'" à partir d'un script PHP, faire un preg_replace puis "UPDATE foo ... WHERE pkey_id=...", mais qui ressemble à un dernier recours lent et moche hack)

181voto

Jeremy Stein Points 8343

Non.

Mais vous pouvez utiliser un udf comme mysql-udf-regexp .

119voto

Ma méthode de force brute pour que cela fonctionne est juste:

  1. Vider la table - mysqldump -u user -p database table > dump.sql
  2. Trouvez et remplacez un couple de modèles - find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \; , Il y a évidemment d'autres expressions perl regeular que vous pourriez exécuter sur le fichier.
  3. Importer la table - mysqlimport -u user -p database table < dump.sql

52voto

rasika godawatte Points 203

J'ai récemment écrit une fonction MySQL pour remplacer les chaînes en utilisant des expressions régulières. Vous pouvez trouver mon message à l'emplacement suivant:

http://techras.wordpress.com/2011/06/02/regex-replace-for-mysql/

14voto

Technophreak Points 149

Nous utilisons actuellement ce qui suit:

https://github.com/mysqludf/lib_mysqludf_preg

10voto

Eddie B Points 1583

Vous pouvez le faire ... mais ce n'est pas très sage ... c'est à peu près aussi audacieux que je vais essayer ... dans la mesure où les RegEx supportent votre bien mieux en utilisant perl ou similaire.

 UPDATE db.tbl
SET column = 
CASE 
WHEN column REGEXP '[[:<:]]WORD_TO_REPLACE[[:>:]]' 
THEN REPLACE(column,'WORD_TO_REPLACE','REPLACEMENT')
END 
WHERE column REGEXP '[[:<:]]WORD_TO_REPLACE[[:>:]]'
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X