Mam tabelę z ~ 500 tys. Rzędów; varchar (255) kolumna UTF8 filename
zawiera nazwę pliku;
Próbuję usunąć różne dziwne znaki z nazwy pliku - pomyślałem, że użyję klasy znaków: [^a-zA-Z0-9()_ .\-]
Czy w MySQL jest funkcja, która pozwala zastąpić wyrażenie regularne ? Szukam funkcji podobnej do funkcji REPLACE () - uproszczony przykład poniżej:
SELECT REPLACE('stackowerflow', 'ower', 'over');
Output: "stackoverflow"
/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-');
Output: "-tackover-low"
Wiem o REGEXP / RLIKE , ale sprawdzają one tylko, czy istnieje dopasowanie, a nie to , co to jest dopasowanie.
( Mógłbym zrobić „ SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'
” ze skryptu PHP, zrobić preg_replace
a potem „ UPDATE foo ... WHERE pkey_id=...
”, ale to wygląda na ostateczny powolny i brzydki hack)
regexp_split
(funkcja + procedura) iregexp_replace
, które są zaimplementowane zREGEXP
operatorem. W przypadku prostych wyszukiwań wystarczy. Możesz go znaleźć tutaj - tak jest w przypadku kodu przechowywanego w MySQL, bez UDF. Jeśli znajdziesz jakieś błędy, które nie są objęte znanymi ograniczeniami - możesz otworzyć problem.Odpowiedzi:
Z MySQL 8.0+ możesz używać
REGEXP_REPLACE
funkcji natywnej .12.5.2 Wyrażenia regularne :
i obsługa wyrażeń regularnych :
DBFiddle Demo
źródło
MySQL 8.0+ :
Możesz użyć natywnego
REGEXP_REPLACE
funkcji .Starsza wersja:
Możesz użyć funkcji zdefiniowanej przez użytkownika ( UDF ), takiej jak mysql-udf-regexp .
źródło
Zamiast tego użyj MariaDB. Ma funkcję
Zobacz dokumenty MariaDB i rozszerzenia wyrażeń regularnych PCRE
Pamiętaj, że możesz także użyć grupowania wyrażeń regularnych (uważam, że to bardzo przydatne):
zwroty
źródło
UPDATE table SET Name = REGEXP_REPLACE(Name, "-2$", "\\1")
Usuwa to -2 z abcxyz-2 z całej kolumny na raz.Moja metoda brutalnej siły, aby to zadziałało, to:
mysqldump -u user -p database table > dump.sql
find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \;
Istnieją oczywiście inne wyrażenia regularne perla, które możesz wykonać na pliku.mysqlimport -u user -p database table < dump.sql
Jeśli chcesz się upewnić, że ciąg nie znajduje się w innym miejscu w zestawie danych, uruchom kilka wyrażeń regularnych, aby upewnić się, że wszystkie występują w podobnym środowisku. Tworzenie kopii zapasowej nie jest również trudne przed uruchomieniem zastępowania, na wypadek, gdyby przypadkowo zniszczyłeś coś, co traci głębię informacji.
źródło
rozwiązujemy ten problem bez użycia wyrażenia regularnego to zapytanie zastępuje tylko ciąg dokładnie dopasowany.
Przykład:
Po wykonaniu wyniku zapytania:
źródło
Niedawno napisałem funkcję MySQL do zamiany ciągów za pomocą wyrażeń regularnych. Możesz znaleźć mój post w następującej lokalizacji:
http://techras.wordpress.com/2011/06/02/regex-replace-for-mysql/
Oto kod funkcji:
Przykładowe wykonanie:
źródło
select regex_replace('.*(abc).*','\1','noabcde')
(zwraca „noabcde”, a nie „abc”).Z przyjemnością informuję, że skoro zadano to pytanie, teraz jest zadowalająca odpowiedź! Spójrz na ten wspaniały pakiet:
https://github.com/mysqludf/lib_mysqludf_preg
Przykładowy SQL:
Znalazłem paczkę z tego postu na blogu jako link do tego pytania .
źródło
AKTUALIZACJA 2: Użyteczny zestaw funkcji wyrażeń regularnych, w tym REGEXP_REPLACE , został teraz udostępniony w MySQL 8.0. Czyni to czytanie niepotrzebnym, chyba że jesteś ograniczony do używania wcześniejszej wersji.
AKTUALIZACJA 1: Zrobiłem to z postu na blogu: http://stevettt.blogspot.co.uk/2018/02/a-mysql-regular-expression-replace.html
Poniższe rozwinięcie funkcji Rasika Godawatte, ale przeszukuje wszystkie niezbędne podłańcuchy, a nie tylko testuje pojedyncze znaki:
Próbny
Demo Rextester
Ograniczenia
\1
,\2
etc.) w celu zastąpienia grup przechwytywanie. Jeśli ta funkcja jest potrzebna, zapoznaj się z tą odpowiedzią która próbuje zapewnić obejście, aktualizując funkcję, aby umożliwić wtórne wyszukiwanie i zamianę w każdym znalezionym dopasowaniu (kosztem zwiększonej złożoności).^
i / lub$
jest używany we wzorcu, muszą znajdować się odpowiednio na samym początku i na samym końcu - np. Wzorce,(^start|end$)
które nie są obsługiwane.a.*?b.*
) Nie jest obsługiwane.Przykłady użycia
Funkcja została użyta do odpowiedzi na następujące pytania StackOverflow:
źródło
Możesz to zrobić ... ale nie jest to zbyt mądre ... jest to tak odważne, jak spróbuję ... o ile pełne wsparcie RegEx będzie znacznie lepsze przy użyciu Perla lub podobnego.
źródło
Możemy użyć warunku IF w zapytaniu SELECT, jak poniżej:
Załóżmy, że dla czegokolwiek z „ABC”, „ABC1”, „ABC2”, „ABC3”, ... chcemy zastąpić „ABC”, a następnie używając warunku REGEXP i IF () w zapytaniu SELECT, możemy to osiągnąć .
Składnia:
Przykład:
źródło
Poniższy w zasadzie znajduje pierwsze dopasowanie od lewej, a następnie zastępuje wszystkie jego wystąpienia (testowane w mysql-5.6).
Stosowanie:
Realizacja:
źródło
Myślę, że istnieje prosty sposób na osiągnięcie tego i działa dobrze dla mnie.
Aby WYBRAĆ wiersze za pomocą REGEX
Aby zaktualizować wiersze za pomocą REGEX
Referencje REGEXP: https://www.geeksforgeeks.org/mysql-regular-expressions-regexp/
źródło