Saya punya meja dengan ~ 500 k baris; varchar (255) kolom UTF8 filename
berisi nama file;
Saya mencoba menghapus berbagai karakter aneh dari nama file - saya pikir saya akan menggunakan kelas karakter: [^a-zA-Z0-9()_ .\-]
Sekarang, apakah ada fungsi di MySQL yang memungkinkan Anda mengganti melalui ekspresi reguler ? Saya mencari fungsi yang mirip dengan fungsi REPLACE () - contoh sederhana berikut:
SELECT REPLACE('stackowerflow', 'ower', 'over');
Output: "stackoverflow"
/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-');
Output: "-tackover-low"
Saya tahu tentang REGEXP / RLIKE , tetapi itu hanya memeriksa apakah ada kecocokan, bukan apa kecocokannya.
(Saya bisa melakukan " SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'
" dari skrip PHP, melakukan a preg_replace
lalu " UPDATE foo ... WHERE pkey_id=...
", tapi itu seperti peretasan terakhir yang lambat & jelek)
regexp_split
(fungsi + prosedur) ®exp_replace
, yang diterapkan denganREGEXP
operator. Untuk pencarian sederhana, itu akan melakukan trik. Anda dapat menemukannya di sini - jadi, ini adalah cara dengan kode tersimpan MySQL, tanpa UDF. Jika Anda menemukan beberapa bug, yang tidak tercakup oleh batasan yang diketahui - jangan ragu untuk membuka masalah.Jawaban:
Dengan MySQL 8.0+ Anda dapat menggunakan
REGEXP_REPLACE
fungsi asli.12.5.2 Ekspresi Reguler :
dan dukungan ekspresi reguler :
Demo DBFiddle
sumber
MySQL 8.0+ :
Anda dapat menggunakan
REGEXP_REPLACE
fungsi asli .Versi yang lebih lama:
Anda dapat menggunakan fungsi yang ditentukan pengguna ( UDF ) seperti mysql-udf-regexp .
sumber
Gunakan MariaDB sebagai gantinya. Ini memiliki fungsi
Lihat MariaDB docs dan PCRE Peningkatan ekspresi reguler
Perhatikan bahwa Anda dapat menggunakan pengelompokan regexp juga (saya menemukan itu sangat berguna):
kembali
sumber
UPDATE table SET Name = REGEXP_REPLACE(Name, "-2$", "\\1")
Ini menghapus -2 dari abcxyz-2 dari seluruh kolom sekaligus.Metode brute force saya untuk mendapatkan ini berfungsi hanya:
mysqldump -u user -p database table > dump.sql
find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \;
, Ada juga ekspresi perl regeular lainnya yang dapat Anda lakukan pada file.mysqlimport -u user -p database table < dump.sql
Jika Anda ingin memastikan string tidak berada di tempat lain dalam dataset Anda, jalankan beberapa ekspresi reguler untuk memastikan semuanya terjadi di lingkungan yang sama. Ini juga tidak sulit untuk membuat cadangan sebelum Anda menjalankan penggantian, jika Anda secara tidak sengaja menghancurkan sesuatu yang kehilangan kedalaman informasi.
sumber
kami mengatasi masalah ini tanpa menggunakan regex kueri ini hanya mengganti string pencocokan tepat.
Contoh:
Setelah mengeksekusi hasil query:
sumber
Baru-baru ini saya menulis fungsi MySQL untuk mengganti string menggunakan ekspresi reguler. Anda dapat menemukan posting saya di lokasi berikut:
http://techras.wordpress.com/2011/06/02/regex-replace-for-mysql/
Berikut adalah kode fungsinya:
Contoh eksekusi:
sumber
select regex_replace('.*(abc).*','\1','noabcde')
(mengembalikan 'noabcde', bukan 'abc').Saya senang melaporkan bahwa karena pertanyaan ini ditanyakan, sekarang ada jawaban yang memuaskan! Lihatlah paket hebat ini:
https://github.com/mysqludf/lib_mysqludf_preg
Contoh SQL:
Saya menemukan paket dari posting blog ini sebagai tertaut pada pertanyaan ini .
sumber
UPDATE 2: Satu set fungsi regex yang berguna termasuk REGEXP_REPLACE sekarang telah disediakan di MySQL 8.0. Ini membuat bacaan tidak perlu kecuali Anda dibatasi untuk menggunakan versi sebelumnya.
UPDATE 1: Sekarang telah membuat ini menjadi posting blog: http://stevettt.blogspot.co.uk/2018/02/a-mysql-regular-expression-replace.html
Berikut ini memperluas fungsi yang disediakan oleh Rasika Godawatte tetapi menjaring semua substring yang diperlukan daripada hanya menguji karakter tunggal:
Demo
Demo Rextester
Keterbatasan
\1
,\2
dll.) Untuk menggantikan grup penangkap. Jika fungsi ini diperlukan, silakan lihat jawaban ini yang mencoba memberikan solusi dengan memperbarui fungsi untuk memungkinkan pencarian dan penggantian sekunder dalam setiap kecocokan yang ditemukan (dengan mengorbankan kompleksitas yang meningkat).^
dan / atau$
digunakan dalam pola, masing-masing harus di awal dan di akhir - misalnya pola seperti(^start|end$)
tidak didukung.a.*?b.*
) Tidak didukung.Contoh Penggunaan
Fungsi ini telah digunakan untuk menjawab pertanyaan StackOverflow berikut:
sumber
Anda 'bisa' melakukannya ... tapi itu tidak terlalu bijaksana ... ini adalah tentang berani seperti saya akan mencoba ... sejauh RegEx penuh mendukung Anda jauh lebih baik menggunakan perl atau sejenisnya.
sumber
Kita dapat menggunakan kondisi JIKA dalam permintaan SELECT seperti di bawah ini:
Misalkan untuk apa pun dengan "ABC", "ABC1", "ABC2", "ABC3", ..., kami ingin mengganti dengan "ABC" lalu menggunakan kondisi REGEXP dan IF () dalam permintaan SELECT, kita dapat mencapai ini .
Sintaksis:
Contoh:
sumber
Yang di bawah ini pada dasarnya menemukan kecocokan pertama dari kiri dan kemudian menggantikan semua kemunculannya (diuji dalam mysql-5.6).
Pemakaian:
Penerapan:
sumber
Saya pikir ada cara mudah untuk mencapai ini dan Ini berfungsi dengan baik untuk saya.
Untuk MEMILIH baris menggunakan REGEX
Untuk MEMPERBARUI baris menggunakan REGEX
Referensi REGEXP: https://www.geeksforgeeks.org/mysql-regular-expressions-regexp/
sumber