Regular Expression atau sering disingkat Regex merupakan sekumpulan karakter yang digunakan untuk mendefinisikan Pola (pattern). Pattern tersebut sering digunakan untuk pencarian terutama untuk meng-extract suatu informasi dari suatu text atau kalimat.
Syntax regex dapat digunakan di banyak bahasa pemrograman, sangat membantu untuk melakukan validasi dan parsing data aneh yang kadang diberikan oleh client. Selain itu Regex juga sangat membantu dalam administrasi server, misalnya memfilter isi file Log, atau sekedar membuat .htaccess dan rule pada Proxy Server.
Setiap karakter pada regex memiliki arti/fungsi tersendiri. Regex akan terlihat sangat primitif jika anda tidak mengetahui fungsi setiap karakternya. Berikut beberapa teori dasar mengenai Regex.
Special Characters
Ada 12 karakter yang memiliki fungsi khusus yang perlu anda perhatikan dalam membaca atau menulis regex:
- \ : Backslash
- ^ : Caret
- $ : Dolar
- . : titik
- | : Vertical bar atau pipa
- ? : tanda tanya
- * : Asterik atau tanda bintang
- + : tanda tambah
- ( : kurung buka
- ) : kurung tutup
- [ : kurung buka siku
- { : Kurung buka korawal
Jika anda ingin menggunakan karakter tersebut dalam pencarian (mejadi Literal Character), anda harus menambahkan tanda backslash (\) sebelum karakter tersebut untuk menghilangkan fungsi khusus nya. Misalnya anda ingin mencari string a*b dalam sebuah kalimat, pattern regex yang benar adalah a\*b, tanda bintang adalah special karakter yang harus anda escape.
Tanda titik ( . ) akan match dengan satu karakter apapun
Character Class
Character Class atau character set digunakan untuk mencari karakter tertentu pada sebuah set yang telah didefinisikan. Karakter yang ingin dicari diletakkan dalam tanda kurung siku []. Misalnya dengan character set [ae] pada patern dal[ae]m, anda dapat menemukan text dalem dan dalam.
Character set hanya akan melakukan matching pada 1 karakter saja, pada contoh pattern diatas ia tidak akan match pada karakter dalaem. Anda juga dapat mencari range angka tertentu dengan character set, misalnya angka 0 sampai 9 dengan pattern [0-9].
Shorthand
\d : digits only atau [0-9] \w : words only / alphanumeric dan underscore [A-Za-z0-9_] \s : whitespace / spasi, tab, line break, atau form feed [ \t\r\n\f]
Shorthand diatas juga memiliki fungsi kebalikan (negate) yang dapat digunakan untuk meng-exclude string tersebut.
\D : match non digit character [^\d] \W : match non word character [^\w] \S : match non whitepsace character [^\s]
Pattern regex bersifat case-sensitive, ia membedakan antara huruf besar dan huruf kecil jadi anda harus cermat dalam menuliskan pattern regex.
Grouping
Sesuai namanya, Grouping digunakan untuk mengelompokkan suatu expresi pattern. Hal ini memungkinkan anda untuk melakukan pengkondisian lanjutan terhadap kelompok pattern tersebut, misalnya dengan quantifier. Hasil match dari sebuah group dapat anda dapatkan terpisah dari full patternnya, fitur ini sangat membantu ketika meng-extract informasi tertentu dari sebuah data.
Grouping dapat dilakukan dengan meletakkan karakter atau pattern kedalam tanda kurung (). contohnya pattern ^(www.)?domain$ akan match dengan text www.domain dan domain saja.
Grouping berbeda dengan Character set. Character set diperuntukan untuk melakukan matching ke 1 karakter saja tanpa memperdulikan urutan nya (sequence)
Alternation
Alternation atau Alternatif dapat digunakan untuk melakukan matching satu atau beberapa karakter alternatif yang didefinisikan. Sederhananya alternation dapat dianggap sebagai OR operator. Alternation operator disimbolkan dengan karakter vertical pipe ( | ).
Contohnya jika anda ingin mencari kalimat yang mengandung kata ayam atau Anjing atau Kucing, maka pattern nya adalah ayam|anjing|kucing.
Fungsi alternation sering digunakan bersamaan dengan fungsi Grouping dan repetition untuk mebuat hasil pattern nya lebih spesifik namun terkondisikan. Contohnya ketika ingin melakukan validasi pada url dengan protocol http atau https, pattern yang dapat anda gunakan adalah ^(http|https):\/\/\w+(\.\w+){1,2}$ . Bingung ? mari kita jabarkan bagaimana membacanya mulai dari kiri ke kanan.
- ^ : tanda caret berfungsi untuk melakukan matching di awal kalimat
- (http|https) : match text yang mengandung text http atau https
- : (titik dua) tidak bermakna khusus, regex akan mencari tanda titik dua pada text
- \/\/ : ini merupakan pattern untuk meng-escape karakter // pada url
- \w+ : match alphanumeric (word), tanda + berarti melakukan repeat sebanyak 1 kali atau lebih, bagian ini akan melakukan matching untuk nama domain.
- (\.\w+){1,2} : group pertama akan melakukan match untuk bagian level domain, misalnya .com atau .org.
bagian {1,2} mendefiniskan minimal 1 atau 2 kali perulangan, ini ditambahkan agar country level seperti .co.id atau .ac.id lolos pada pattern ini - $ : melakukan matching di akhir kalimat,
karena ada tanda caret (^) di awal pattern ini, maka pattern ini akan melakukan match dari awal sampai akhir string, tidak diperuntukan untuk mencari alamat url didalam sekumpulan text
Pattern yang saya buat pada contoh diatas bukanlah pattern yang sempurna, text https://domain.domain.domain masih match dengan menggunakan pattern diatas, jadi jangan digunakan pattern diatas untuk validasi di kode anda 😀
Anchor
Bagian ini digunakan untuk mencocokan Posisi pada sebuah pattern Regex.
^ : Match string di Awal text $ : Match string di Akhir text
Contoh penggunaan simbol diatas adalah sebagai berikut, ada 3 buah string yang digunakan test sample:
// String yang di test: Kipas Angin (1) Angin Laut (2) Kipas Angin Laut (3) // Case: mendapatkan text yang memiliki Awalan Angin // Pattern: ^Angin // Match: Angin Laut (2) // Case: mendapatkan text yang memiliki Akhiran Angin // Pattern: Angin$ // Match: Kipas Angin (1) // Case: mendapatkan text Kipas Angin tanpa tambahan apapun ( Awal & Akhir ) // Pattern: ^Kipas Angin$ // Match: Kipas Angin (1) Test Disini
Repetition Operator
Repetition operator adalah operator atau karakter khusus yang fungsinya mengulangi pattern sebelumnya. Fungsi ini sering digunakan untuk melakukan match pada text yang memiliki pola berulang (repetitive). Misalnya untuk memvalidasi nomor HP yang terdiri dari 14 digit angka (14 kali pengulangan angka)
* : ulangi item sebelumnya 0 kali atau beberapa kali + : ulangi item sebelumnya minimal 1 kali atau lebih ? : Membuat item sebelumnya menjadi Optional {n} : ulangi item sebelumnya sebanyak n kali {n,} : ulangi item sebelumnya minimal sebanyak n kali atau lebih {n,m} : ulangi item minimal n kali, maksimal m kali
Contoh penggunaan operator diatas
// String di Test ab abc abcc bc // Test 1 // Pattern: abc* // Match: ab abc abcc // Test 2 // Pattern: abc+ // Match: abc abcc // Test 3 // Pattern: abc? // Match: ab abc abc // Test 4 // Pattern: abc{2} // Match: abcc
Contoh kasus meng-extract nomor HP dari text yang diinputkan user. Seperti yang kita ketahui user ada yang menginputkan nomor handphone dengan awalan 081xxxxx atau dengan dilengkapi dengan kode negara +6281xxxxx. Dengan menggunakan regex kita bisa mendapatkan nomor handphone sesungguhnya (81xxxxxx) dari text yang diinputkan user. Patternnya adalah (0|+62)?(\d{10,11})$
- (0|+62)? : group pertama adalah optional bisa berupa angka 0 atau +62 atau tidak diisi (perhatikan tanda tanya)
- (\d{10,11}) : group kedua ini merupakan nomor handphone sesungguhnya
\d : melakukan match ke hanya ke angka (digits)
{10,11} : untuk pengulangan dalam kasus ini mengulangi digit sebanyak 10 atau maksimal 11
Regex Flags
Regex memiliki beberapa options (Flags) yang dapat anda aktifkan sesuai kebutuhan anda. Regex options berada diluar regex pattern, biasanya ditempatkan sesudah pattern.
- i : insensitive, membuat pattern regex menjadi case-insensitive, atau tidak membedakan huruf besar atau kecil.
- m : multi-line, bila diaktifkan karakter ^ dan $ akan melakukan matching sampai ke akhir baris (sampai line-break atau enter) bukan keseluruhan text
Tulisan diatas hanyalah sebagian kecil dari teori dasar Regex, masih ada banyak hal lainnya yang dapat anda lakukan dengan regex.
Belajar regex lebih mudah dengan adanya contoh kasus, namun saat ini saya belum sempat membuatnya :D. silahkan ditunggu update selanjutnya.
Mantap Bro
Suksma gus…
thanku bro