MySQL Ekspresi Reguler (Regexp)
⚡ Ringkasan Cerdas
MySQL Ekspresi Reguler (REGEXP) mencocokkan nilai kolom dengan pola fleksibel yang tidak dapat diungkapkan oleh wildcard. Penjelasan ini mencakup sintaks REGEXP, sinonim RLIKE, setiap metakarakter yang didukung, contoh kueri yang telah dikoreksi terhadap basis data myflixdb, dan fungsi ekspresi reguler yang ditambahkan. MySQL 8.0.
Apa MySQL ekspresi reguler?
MySQL ekspresi reguler Membantu Anda mencari data yang sesuai dengan kriteria kompleks. Ekspresi reguler adalah pola yang menggambarkan bentuk nilai yang Anda cari, bukan nilai itu sendiri.
Jika Anda sudah pernah bekerja dengan MySQL wildcardAnda mungkin bertanya mengapa ekspresi reguler layak dipelajari padahal LIKE menghasilkan hasil yang serupa. Jawabannya adalah daya ekspresif: wildcard hanya menawarkan dua simbol, sedangkan ekspresi reguler menggambarkan rentang karakter, alternatif, pengulangan, dan posisi kata dalam satu pola.
Setelah tujuan ditetapkan, bagian selanjutnya memperkenalkan sintaks yang akan Anda gunakan di setiap kueri REGEXP.
Sintaks dasar REGEXP
Sintaks dasar untuk ekspresi reguler adalah sebagai berikut.
SELECT * FROM table_name WHERE fieldname REGEXP 'pattern';
SINI:
- “Pernyataan SELECT” adalah standar PILIH pernyataan.
- “Nama kolom DIMANA” adalah nama kolom tempat ekspresi reguler dijalankan.
- “Pola REGEXP” — REGEXP adalah operator ekspresi reguler, dan 'pattern' mewakili pola yang akan dicocokkan. RLIKE adalah sinonim untuk REGEXP dan memberikan hasil yang sama. Untuk menghindari kebingungan dengan operator LIKE, lebih baik menggunakan REGEXP.
Sekarang mari kita lihat contoh praktis.
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
Kueri di atas mencari semua judul film yang mengandung kata "code". Tidak masalah apakah "code" muncul di awal, di tengah, atau di akhir judul. Selama judul tersebut mengandung pola tersebut, baris tersebut akan dikembalikan.
Mencocokkan awal suatu nilai dengan daftar karakter.
Misalkan kita menginginkan film-film yang judulnya diawali dengan huruf a, b, c, atau d, diikuti oleh sejumlah karakter lainnya. Kita menggabungkan daftar karakter dengan metakarakter caret untuk mencapai hasil tersebut.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Menjalankan skrip di atas dalam MySQL Workbench Jika dibandingkan dengan database myflixdb, kita mendapatkan hasil sebagai berikut.
| film_id | judul | direktur | tahun_dirilis | kategori_id |
|---|---|---|---|---|
| 4 | Code Nama Hitam | Edgar Jimz | 2010 | NULL |
| 5 | Gadis Kecil Ayah | NULL | 2007 | 8 |
| 6 | malaikat dan iblis | NULL | 2007 | 6 |
| 7 | Da Vinci Code | NULL | 2007 | 6 |
Dalam pola '^[abcd]', tanda sisipan (^) mengharuskan pencocokan dimulai dari awal nilai, dan daftar karakter [abcd] hanya menerima judul yang huruf pertamanya adalah a, b, c, atau d. Perbandingan tidak peka huruf besar/kecil di bawah kolasi default, itulah sebabnya “Code Nama "Black" dikembalikan.
Tidak termasuk karakter dengan daftar karakter yang dinegasikan.
Sekarang mari kita modifikasi skrip dan negasikan daftar karakter untuk melihat baris mana yang dikembalikan.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Menjalankan skrip di atas dalam MySQL Pengujian Workbench terhadap basis data myflixdb memberikan hasil sebagai berikut.
| film_id | judul | direktur | tahun_dirilis | kategori_id |
|---|---|---|---|---|
| 1 | Bajak Laut Karibia 4 | Rob Marshall | 2011 | 1 |
| 2 | Melupakan Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 3 | X-Men | 2008 | ||
| 9 | Honey mooners | John Schultz | 2005 | 8 |
| 16 | 67% Bersalah | 2012 | ||
| 17 | The Great Dictator | Chalie Chaplie | 1920 | 7 |
| 18 | contoh film | Anonim | 8 | |
| 19 | film 3 | John Brown | 1920 | 8 |
Di dalam daftar karakter, tanda sisipan (^) berubah arti: '^[^abcd]' masih mengaitkan kecocokan di awal, sedangkan [^abcd] sekarang mengecualikan setiap judul yang dimulai dengan salah satu karakter yang terdapat di dalamnya.
Kedua contoh ini hanya menggunakan jangkar dan daftar karakter. Bagian selanjutnya membahas keseluruhan set metakarakter.
Metakarakter ekspresi reguler
Contoh-contoh di atas menunjukkan bentuk ekspresi reguler yang paling sederhana. Metakarakter memungkinkan Anda untuk menyempurnakan pencarian pola: metakarakter mengekspresikan pengulangan, alternatif, rentang, dan posisi. Tabel di bawah ini mencantumkan setiap metakarakter yang didukung oleh MySQL Operator REGEXP, dengan contoh yang telah dikoreksi untuk masing-masing operator.
| Arang | Deskripsi | Example | |
|---|---|---|---|
| * | The tanda bintang (*) cocok dengan nol (0) atau lebih contoh dari karakter tunggal yang mendahuluinya. | PILIH * DARI film DIMANA judul REGEXP 'da*'; cocok dengan huruf “d” yang diikuti oleh nol atau lebih karakter “a”, jadi Da Vinci Code dan Daddy's Little Girls memenuhi syarat. Gunakan 'da+' jika huruf “a” memang harus ada. | |
| + | The ditambah (+) cocok dengan satu atau lebih contoh karakter yang mendahuluinya. | PILIH * DARI `film` DI MANA `judul` REGEXP 'mon+'; Menampilkan semua film yang mengandung kata "mon" diikuti oleh satu atau lebih karakter "n". Misalnya, Angels and Demons. | |
| ? | The tanda tanya (?) cocok dengan nol (0) atau satu kemunculan karakter yang mendahuluinya. | PILIH * DARI `kategori` DIMANA `nama_kategori` REGEXP 'com?'; mencocokkan “co” dengan “m” opsional. Misalnya, comedy dan romantic comedy. | |
| . | The dot (.) Mencocokkan karakter tunggal apa pun kecuali baris baru. | PILIH * DARI film WHERE `year_released` REGEXP '200.'; Menampilkan semua film yang dirilis pada tahun yang diawali dengan angka “200” diikuti oleh satu karakter tertentu. Misalnya, 2005, 2007, 2008. | |
| [abc] | The daftar karakter [abc] cocok dengan salah satu karakter yang terdapat di dalam tanda kurung. | PILIH * DARI `film` DIMANA `judul` REGEXP '[vwxyz]'; menampilkan semua film yang mengandung satu karakter dari “vwxyz”. Misalnya, X-Men dan Da Vinci. Code. | |
| [^ abc] | The daftar negasi [^abc] cocok dengan karakter apa pun kecuali karakter yang diapit. | PILIH * DARI `film` DI MANA `judul` REGEXP '^[^vwxyz]'; menampilkan semua film yang judulnya tidak diawali dengan karakter dalam "vwxyz". | |
| [AZ] | The rentang [AZ] cocok dengan huruf kapital apa pun. | PILIH * DARI `anggota` DI MANA `alamat_pos` REGEXP '[AZ]'; Menampilkan semua anggota yang alamat posnya mengandung huruf antara A dan Z. Misalnya, Janet Jones dengan nomor keanggotaan 1. | |
| [az] | The rentang [az] cocok dengan huruf kecil apa pun. | PILIH * DARI `anggota` DI MANA `alamat_pos` REGEXP '[az]'; Menampilkan semua anggota yang alamat posnya mengandung huruf antara a dan z. Perhatikan bahwa kolasi default tidak peka terhadap huruf besar/kecil, sehingga rentang ini juga cocok dengan huruf kapital. | |
| [0-9] | The rentang [0-9] cocok dengan angka apa pun dari 0 hingga 9. | SELECT * FROM `members` WHERE `contact_number` REGEXP '[0-9]'; Menampilkan semua anggota yang nomor kontaknya mengandung setidaknya satu digit. Misalnya, Robert Phil. | |
| ^ | The tanda sisipan (^) Menambatkan kecocokan ke awal nilai. | PILIH * DARI `film` DIMANA `judul` REGEXP '^[cd]'; menampilkan semua film yang judulnya diawali dengan huruf “c” atau “d”. Misalnya, Code Name Black, Daddy's Little Girls, dan Da Vinci Code. | |
| $ | The tanda dolar ($) menambatkan kecocokan ke akhir nilai. | SELECT * FROM `movies` WHERE `title` REGEXP 'code$'; menampilkan semua film yang judulnya berakhiran dengan "code". Misalnya, Davinci Code. | |
| | | The garis vertikal (|) mengisolasi alternatif. | PILIH * DARI `film` DI MANA `judul` REGEXP '^[cd]|^[u]'; menampilkan semua film yang judulnya diawali dengan huruf “c”, “d”, atau “u”. Misalnya, Code Nama Black, Da Vinci Code, dan Dunia Bawah – Awakening. | |
| \b | The batas kata (\b) Cocok dengan awal atau akhir sebuah kata. Ini menggantikan penanda lama [[:<:]] dan [[:>:]], yang MySQL 8.0 dihapus. | SELECT * FROM `movies` WHERE `title` REGEXP '\\bfor'; Menampilkan semua film yang kata awalnya diawali dengan "for". Misalnya, Forgetting Sarah Marshal. Pada MySQL 5.7 Pola yang setara adalah '[[:<:]]for'. | |
| [[:kelas:]] | The kelas karakter mencocokkan kelompok karakter bernama: [[:alpha:]] untuk huruf, [[:space:]] untuk spasi, [[:punct:]] untuk tanda baca, dan [[:upper:]] untuk huruf kapital. Perhatikan dua kali lipat tanda kurung siku. | SELECT * FROM `movies` WHERE `title` REGEXP '^[[:alpha:][:space:]]+$'; Menampilkan semua film yang judulnya hanya berisi huruf dan spasi. Misalnya, Forgetting Sarah Marshal, sedangkan Pirates of the Caribbean 4 dihilangkan karena angkanya. | |
Garis miring terbalik (\) adalah karakter escape. Karena MySQL Menguraikan string terlebih dahulu dan pola kedua, garis miring terbalik literal harus ditulis sebagai garis miring terbalik ganda (\\) di dalam pola REGEXP.
⚠️ Peringatan versi: MySQL Versi 8.0.4 menggantikan mesin ekspresi reguler lama dengan pustaka ICU. Penanda kata [[:<:]] dan [[:>:]] dihapus dalam rilis tersebut, sehingga pola yang disalin dari materi lama akan gagal dengan "kesalahan sintaks" pada MySQL 8.0. Gunakan \b sebagai gantinya.
Setelah semua metakarakter didefinisikan, muncul pertanyaan yang wajar: kapan REGEXP harus menggantikan operator LIKE yang lebih sederhana?
REGEXP vs LIKE: mana yang sebaiknya Anda gunakan?
Kedua operator tersebut menyaring baris berdasarkan pola, tetapi mereka menyelesaikan masalah yang berbeda. LIKE hanya memahami dua simbol, sedangkan REGEXP memahami seluruh himpunan metakarakter yang ditunjukkan di atas. Kekuatan itu memiliki biaya, jadi pilihan tersebut merupakan pertimbangan untung rugi daripada preferensi.
| Kriterium | SEPERTI | REGEXP |
|---|---|---|
| Simbol pola | % dan _ saja | Anchors, rentang, pergantian, kuantifikasi, kelas karakter |
| Penggunaan khas | Pencarian berdasarkan awalan, akhiran, dan "berisi" | Validasi, beberapa alternatif, pencocokan berdasarkan posisi. |
| Penggunaan indeks | Mungkin terjadi jika pola tidak diawali dengan % | Tidak pernah menggunakan indeks |
| Nilai kembali | BENAR atau SALAH | 1 atau 0, dan NULL jika salah satu operand adalah NULL. |
Pilih LIKE untuk pencocokan langsung, karena mudah dibaca dan masih dapat menggunakan indeks. Pilih REGEXP ketika satu pola harus menyatakan beberapa aturan sekaligus, seperti “diawali dengan c atau d dan diakhiri dengan angka”. Pada tabel besar, persempit baris terlebih dahulu dengan kondisi terindeks, lalu terapkan REGEXP pada himpunan yang lebih kecil tersebut.
MySQL 8.0 fungsi ekspresi reguler
Operator REGEXP hanya menjawab satu pertanyaan: apakah nilainya cocok dengan polanya? MySQL Versi 8.0 menambahkan empat fungsi yang lebih canggih dan memungkinkan Anda untuk menemukan, misalnyatract, dan menulis ulang teks yang cocok. Masing-masing menerima argumen match_type opsional, di mana 'c' memaksa perbandingan peka huruf besar/kecil dan 'i' memaksa perbandingan tidak peka huruf besar/kecil.
- REGEXP_LIKE(expr, pattern) Mengembalikan nilai 1 ketika nilai tersebut cocok dengan pola. Ini adalah bentuk fungsi dari operator REGEXP, dan argumen match_type secara eksplisit menunjukkan sensitivitas huruf besar/kecil.
- REGEXP_INSTR(expr, pattern) Mengembalikan posisi karakter pertama yang cocok, atau 0 jika pola tidak ditemukan.
- REGEXP_SUBSTR(expr, pattern) Mengembalikan substring yang cocok itu sendiri, yang berguna untuk mengambil tahun, kode, atau angka dari nilai teks yang lebih panjang.
- REGEXP_REPLACE(expr, pattern, replacement) Mengembalikan nilai dengan setiap kecocokan yang diganti, sehingga dapat membersihkan data di dalam Kueri PEMBARUAN SQL.
SELECT title, REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title FROM `movies` WHERE REGEXP_LIKE(title, '[0-9]');
Kueri di atas mengembalikan setiap judul film yang mengandung angka, beserta angka-angkanya itu sendiri. Pada MySQL 5.7 Fungsi-fungsi ini tidak tersedia, sehingga operator REGEXP tetap menjadi satu-satunya pilihan.

