Apa itu Character Class?
Character class (kelas karakter) memungkinkan kamu mencocokkan satu karakter dari sekumpulan karakter tertentu. Ditulis di dalam tanda kurung siku [...].
/[aeiou]/.test("halo"); // true (cocok "a")
/[aeiou]/.test("gym"); // false (tidak ada vokal)
Range (Rentang)
Gunakan tanda hubung - untuk mendefinisikan rentang karakter:
// Satu digit
/[0-9]/.test("abc5def"); // true
// Huruf kecil
/[a-z]/.test("Hello"); // true (cocok "e")
// Huruf besar
/[A-Z]/.test("hello"); // false
// Gabungan range
/[a-zA-Z0-9]/.test("!"); // false (bukan huruf/angka)
Kamu bisa menggabungkan beberapa range dalam satu class: [a-zA-Z] cocok dengan huruf apa saja (besar atau kecil).
Negasi (Negated Class)
Tambahkan ^ di awal character class untuk mencocokkan karakter yang TIDAK ada di dalam kelas:
// Bukan angka
/[^0-9]/.test("123"); // false (semuanya angka)
/[^0-9]/.test("12a3"); // true (ada "a")
// Bukan huruf kecil
/[^a-z]/.test("hello"); // false
/[^a-z]/.test("Hello"); // true (ada "H")
// Bukan whitespace
/[^ \t\n]+/.test("halo"); // true
Karakter Khusus di Dalam Character Class
Di dalam [...], sebagian besar metacharacter kehilangan arti khususnya:
// Titik di dalam [] = titik literal (bukan wildcard)
/[.]/.test("3.14"); // true (cocok titik)
/[.]/.test("3x14"); // false ✓
// Tapi beberapa masih perlu di-escape:
// ] harus di-escape: [\]]
// \ harus di-escape: [\\]
// ^ hanya spesial di posisi pertama
// - hanya spesial di antara karakter (range)
Trik: letakkan - di awal atau akhir agar dianggap literal:
/[-abc]/.test("-"); // true (- literal di awal)
/[abc-]/.test("-"); // true (- literal di akhir)
Contoh Praktis
// Cek apakah string hanya berisi hex characters
const isHex = /^[0-9a-fA-F]+$/.test("1a2F3b");
console.log(isHex); // true
// Cek karakter yang valid untuk username
const validUsername = /^[a-zA-Z0-9_]+$/.test("user_123");
console.log(validUsername); // true
// Temukan semua konsonan
const konsonan = "belajar regex".match(/[^aeiou\s]/g);
console.log(konsonan); // ["b", "l", "j", "r", "r", "g", "x"]
// Pisahkan berdasarkan karakter non-alfanumerik
const parts = "nama:umur;kota".split(/[^a-zA-Z]/);
console.log(parts); // ["nama", "umur", "kota"]
Shorthand vs Character Class
Ingat bahwa shorthand seperti \d, \w, \s pada dasarnya adalah character class yang disingkat:
// Keduanya identik:
/[0-9]/.test("5"); // true
/\d/.test("5"); // true
// \w = [a-zA-Z0-9_]
// \s = [ \t\n\r\f\v]
Gunakan shorthand untuk kode yang lebih ringkas, dan character class custom saat kamu butuh kontrol lebih spesifik.
🎭 Analogi sehari-hari: Character class = daftar undangan VIP. [abc] = "boleh masuk kalau salah satu nama ini". [^abc] = "boleh masuk kalau BUKAN salah satu nama ini" (negasi). [a-z] = "siapa pun yang nama belakangnya antara A sampai Z". Bouncer cek satu karakter di pintu, sesuai daftar.
💡 Inside [...], metakarakter tenang: Hampir semua metakarakter (., *, +, dll) kehilangan makna khusus di dalam character class. [.] = titik literal, gak perlu escape. Cuma 4 yang masih spesial: ] (close bracket), \ (backslash), ^ (di awal = negasi), - (range, kecuali di ujung).
⚠️ Jebakan klasik:
- Lupa range valid —
[a-Z]invalid karena Z code-point < a. Tulis[a-zA-Z] ^di posisi tengah = literal^, bukan negasi. Negasi cuma di posisi pertama-posisi tengah = range. Posisi awal/akhir = literal.[-abc]literal,[a-c]range a sampai c- Forget locale-aware —
[a-z]di Indonesia/Java gak include accented chars. Pakai Unicode property\p{Letter} - Negated class match newline —
[^a]cocok newline (kecuali pakai flag tertentu)
🎯 Pattern umum:
- Hex color:
^#[0-9a-fA-F]{6}$ - Slug URL:
^[a-z0-9-]+$ - Username:
^[a-zA-Z0-9_]{3,20}$ - Konsonan:
[^aeiouAEIOU\s\d] - Identifier valid:
^[a-zA-Z_][a-zA-Z0-9_]*$
TL;DR: Character class [...] = match satu karakter dari set. Range dengan -. Negasi [^...]. Inside [], metakarakter biasanya jadi literal. Shorthand \d \w \s = pendek + readable equivalent.