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.

  • 🔍 Core Operauntuk: REGEXP membandingkan sebuah kolom dengan sebuah pola dan mengembalikan nilai 1 jika cocok, sedangkan RLIKE adalah sinonim yang tepat dari REGEXP.
  • 🧩 pola Anchors: Tanda sisipan (^) mengaitkan kecocokan ke awal nilai, dan tanda dolar ($) mengaitkannya ke akhir.
  • 🔤 Daftar Karakter: [abcd] cocok dengan karakter apa pun yang diapitnya, dan [^abcd] mengecualikan setiap karakter yang diapitnya dari himpunan hasil.
  • Kuantifikasi: Tanda bintang, tanda tambah, dan tanda tanya berlaku untuk karakter tunggal yang mendahuluinya, bukan untuk keseluruhan string.
  • 🛡️ Umpanping Aturan: Garis miring terbalik literal harus digandakan di dalam pola, karena MySQL memproses string tersebut dua kali.
  • 🆕 Perubahan Versi: MySQL 8.0 dipindahkan ke mesin ICU, mengganti [[:<:]] dan [[:>:]] dengan \b, dan menambahkan REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, dan REGEXP_INSTR.
  • Catatan Kinerja: REGEXP tidak pernah menggunakan indeks, jadi saring baris dengan kondisi yang diindeks terlebih dahulu setiap kali kueri mengizinkannya.

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.

Pertanyaan Umum Demo Slot

Tidak secara default. REGEXP mengikuti kolasi kolom, dan kolasi standar tidak peka terhadap huruf besar/kecil. Tambahkan kata kunci BINARY sebelum kolom, atau panggil REGEXP_LIKE dengan tipe pencocokan 'c', untuk memaksa perbandingan yang peka terhadap huruf besar/kecil.

Tidak ada perbedaan fungsional. RLIKE adalah sinonim dari REGEXP yang MySQL Untuk menjaga kompatibilitas, REGEXP lebih disukai dalam praktiknya, karena RLIKE mudah membingungkan dengan hal-hal yang tidak terkait. Operator LIKE Digunakan untuk karakter pengganti (wildcard).

REGEXP tidak dapat menggunakan indeks, jadi MySQL Mengevaluasi pola baris demi baris. Pertama-tama, kurangi jumlah baris yang dipindai dengan kondisi terindeks, rentang tanggal, atau indeks teks lengkap, lalu terapkan ekspresi reguler ke kumpulan hasil yang lebih kecil tersebut.

Ya. Asisten AI mengubah aturan bahasa biasa menjadi pola REGEXP dan menjelaskan setiap metakarakter. Uji hasilnya di MySQL Workbench terhadap baris sampel, karena satu jangkar yang salah tempat dapat mengubah seluruh kumpulan hasil.

Ya. Asisten AI menghasilkan pernyataan REGEXP_REPLACE yang menghilangkan tanda baca, menormalkan nomor telepon, atau memangkas spasi yang tidak perlu. Jalankan pola tersebut di dalam SELECT terlebih dahulu, konfirmasikan nilai yang ditulis ulang, dan baru kemudian terapkan di dalam pernyataan SELECT. pernyataan PEMBARUAN.

Ringkaslah postingan ini dengan: