Menggunakan Regular Expression (REGEXP) di MySQL
MySQL menyediakan fungsi REGEXP untuk pencarian teks berbasis pola (regular expression). Berbeda dengan LIKE yang hanya mendukung wildcard sederhana (% dan _), REGEXP mampu mencocokkan pola kompleks seperti awal/akhir string, rentang karakter, kelas karakter, dan banyak lagi.
Panduan ini akan membahas penggunaan REGEXP di MySQL dengan contoh praktis yang bisa langsung diterapkan di Nusa Cloud VPS.
Prasyaratโ
- Server Nusa Cloud VPS dengan MySQL 8.0 atau lebih baru
- Akses ke MySQL sebagai user dengan hak SELECT, INSERT, dan ALTER
Catatan: REGEXP didukung penuh di MySQL 8.0.x. Contoh dalam panduan ini menggunakan sintaks yang kompatibel dengan MySQL 8.0 ke atas.
Siapkan Data Uji Cobaโ
Buat database dan tabel untuk praktik:
CREATE DATABASE regex_db;
USE regex_db;
CREATE TABLE customers (
customer_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(255)
) ENGINE = InnoDB;
INSERT INTO customers (first_name, last_name, email) VALUES
('JANE', 'SMITH', 'jane@example.com'),
('MARY', 'ROE', '-'),
('JOHN', 'DOE', 'john_doe@example.com'),
('MARY', 'FREDRICK', ''),
('BANNIE', 'ISAAC', 'bannie_isaac@example.com');
1. Mencocokkan Awal String (^)โ
Karakter ^ mencocokkan posisi awal string. Gunakan untuk mencari record yang diawali pola tertentu.
Cari semua first_name yang diawali huruf J:
SELECT customer_id, first_name, last_name
FROM customers
WHERE first_name REGEXP '^J';
Hasil:
+-------------+------------+-----------+
| customer_id | first_name | last_name |
+-------------+------------+-----------+
| 1 | JANE | SMITH |
| 3 | JOHN | DOE |
+-------------+------------+-----------+
2. Mencocokkan Akhir String ($)โ
Karakter $ mencocokkan posisi akhir string. Gunakan untuk mencari record yang diakhiri pola tertentu.
Cari last_name yang diakhiri OE:
SELECT customer_id, first_name, last_name
FROM customers
WHERE last_name REGEXP 'OE$';
Hasil:
+-------------+------------+-----------+
| customer_id | first_name | last_name |
+-------------+------------+-----------+
| 2 | MARY | ROE |
| 3 | JOHN | DOE |
+-------------+------------+-----------+
3. Mencocokkan Karakter dalam Kurung Siku ([])โ
Kurung siku [abc] mencocokkan salah satu karakter yang disebutkan di dalamnya. Berguna untuk mencari record yang mengandung variasi karakter tertentu.
Cari first_name yang mengandung huruf H atau Y:
SELECT customer_id, first_name, last_name
FROM customers
WHERE first_name REGEXP '[HY]';
Hasil:
+-------------+------------+-----------+
| customer_id | first_name | last_name |
+-------------+------------+-----------+
| 2 | MARY | ROE |
| 3 | JOHN | DOE |
| 4 | MARY | FREDRICK |
+-------------+------------+-----------+
4. Rentang Karakter (-)โ
Tanda hubung - di dalam kurung siku menentukan rentang karakter, misalnya [a-d] (a sampai d) atau [0-9] (angka 0โ9).
Cari first_name yang mengandung huruf a sampai d:
SELECT customer_id, first_name, last_name
FROM customers
WHERE first_name REGEXP '[a-d]';
Hasil:
+-------------+------------+-----------+
| customer_id | first_name | last_name |
+-------------+------------+-----------+
| 1 | JANE | SMITH |
| 2 | MARY | ROE |
| 4 | MARY | FREDRICK |
| 5 | BANNIE | ISAAC |
+-------------+------------+-----------+
5. Mencocokkan Substringโ
Tanpa anchor (^ atau $), REGEXP mencari pola di posisi mana pun dalam string. Cari nama yang mengandung substring AN dalam urutan tersebut:
SELECT customer_id, first_name, last_name
FROM customers
WHERE first_name REGEXP 'AN';
Hasil:
+-------------+------------+-----------+
| customer_id | first_name | last_name |
+-------------+------------+-----------+
| 1 | JANE | SMITH |
| 5 | BANNIE | ISAAC |
+-------------+------------+-----------+
Untuk substring di posisi tertentu (dua karakter diikuti "NE"):
SELECT customer_id, first_name, last_name
FROM customers
WHERE first_name REGEXP '^..NE';
6. Menggunakan REGEXP dengan UPDATEโ
REGEXP tidak hanya untuk SELECT. Anda bisa menggunakannya di UPDATE untuk mengubah data berdasarkan pola.
Tambah kolom address dan zip:
ALTER TABLE customers
ADD address VARCHAR(255) AFTER email,
ADD zip VARCHAR(20) AFTER address;
Update data alamat:
UPDATE customers SET address = '123 FIRST RD. TOWN 1 AZ 8659' WHERE customer_id = 1;
UPDATE customers SET address = '456 2ND RD. TOWN 2 AZ 12345' WHERE customer_id = 2;
UPDATE customers SET address = '789 3RD RD. TOWN 3 AZ 8659' WHERE customer_id = 3;
UPDATE customers SET address = '555 FIRST RD. TOWN 1 AZ 8659' WHERE customer_id = 4;
UPDATE customers SET address = '987 FIFTH RD TOWN 2 1414' WHERE customer_id = 5;
Sekarang extract kode pos 8659 dari kolom address:
UPDATE customers
SET zip = '8659'
WHERE address REGEXP '8659$';
7. Karakter Negasiโ
Gunakan [^...] di dalam kurung siku untuk mencocokkan karakter yang bukan yang disebutkan.
Cari last_name yang mengandung karakter selain huruf โ misalnya tanda hubung atau apostrof:
SELECT customer_id, first_name, last_name
FROM customers
WHERE last_name REGEXP '[^A-Za-z]';
Untuk mencari string yang tidak mengandung pola tertentu, gunakan NOT REGEXP:
SELECT customer_id, first_name, last_name
FROM customers
WHERE last_name NOT REGEXP 'E';
Hasil:
+-------------+------------+-----------+
| customer_id | first_name | last_name |
+-------------+------------+-----------+
| 5 | BANNIE | ISAAC |
+-------------+------------+-----------+
8. Membersihkan Data Uji Cobaโ
Setelah selesai, hapus database uji coba:
DROP DATABASE IF EXISTS regex_db;
Troubleshootingโ
Query REGEXP tidak mengembalikan hasil yang diharapkan
- Penyebab: REGEXP di MySQL bersifat case-insensitive untuk karakter alfabet. Pola
[A-Z]juga akan mencocokkan huruf kecil. - Solusi: Jika perlu case-sensitive, gunakan
REGEXP BINARY.
Error menggunakan karakter khusus seperti . atau *
- Penyebab: Karakter tersebut memiliki arti khusus dalam regex. Titik (
.) mencocokkan karakter apa pun,*berarti nol atau lebih pengulangan. - Solusi: Escape dengan backslash:
\\.untuk mencocokkan titik literal.
Catatan Pentingโ
| Simbol | Fungsi |
|---|---|
^ | Awal string |
$ | Akhir string |
. | Karakter tunggal (wildcard) |
[abc] | Salah satu karakter a, b, atau c |
[a-z] | Rentang karakter a sampai z |
[^abc] | Bukan a, b, atau c |
* | Nol atau lebih pengulangan |
+ | Satu atau lebih pengulangan |
| | Operator OR (pola1|pola2) |
Kesimpulanโ
MySQL REGEXP sangat berguna untuk pencarian data kompleks yang tidak bisa dijangkau LIKE. Mulai dari validasi format data, filter record, hingga update massal berdasarkan pola โ REGEXP menjadi alat andalan dalam administrasi database.
Gunakan Nusa Cloud VPS sebagai infrastruktur database MySQL Anda untuk performa dan keandalan maksimal.
