25
Jul
2021

Belajar Memahami Regex

Apa itu Regex?

Regex atau Regular Expression merupakan sebuah atau sekumpulan karakter yang membentuk pola sehingga bisa digunakan untuk pencarian atau pengecekan di sebuah string. Pola yang dibuat bisa beraneka ragam seperti pola email, nomor hp, dan sebagainya.

Penerapan regex dalam aplikasi bisa digunakan untuk memvalidasi input/masukan dari user agar sesuai dengan kebutuhan sistem. Atau juga bisa digunakan untuk pencarian kata dalam sebuah dokumen misalnya.

Sintaksis Regex

Berikut akan saya bahas satu per satu karakter yang bisa digunakan dalam regex untuk membuat pola-pola.

Delimiter/Pembatas

Sesuai namanya, delimiter atau pembatas dalam regex berfungsi sebagai pembatas. Setiap pola regex harus mempunyai pembatas awal dan akhir.

/andevindo/

Dari contoh di atas, / berfungsi sebagai pembatas dan andevindo adalah polanya.

Karakter selain huruf, angka, garis miring terbalik (\), dan spasi, bisa digunakan sebagai pembatas, seperti #, ~, dan sebagainya.

//Contoh string
"Lorem Ipsum Dolor Sit"

//Regex
#sum#

Jika regex diatas dijalankan untuk validasi, maka hasilnya adalah valid karena kata sum ditemukan dan # bisa digunakan untuk pembatas.

Character Classes

Character Classes atau jika diartikan ke dalam bahasa Indonesia adalah kelas-kelas karakter, lalu apa artinya? Terdapat berbagai macam definisi terkait ini, oleh karena itu saya coba definisikan sendiri menurut pemahaman saya. Jadi artinya adalah jajaran/barisan karakter regex (bisa satu atau lebih dari satu) yang mewakili sebuah karakter string yang dicari. Untuk lebih jelasnya lihat contoh di bawah ini.

//Contoh string
"Aku menemukan topi di toko kopi"

//Regex
/[tk]opi/

Jika diperhatikan dari regex di atas, terdapat [tk] kemudian diikuti opi. Arti dari [tk] ini adalah mencocokkan sebuah karakter dari string yang dicari dengan huruf t atau k. Jadi terdapat 2 kata yang cocok dengan regex tersebut yaitu topi dan kopi.

Ciri khas dari character classes yaitu diapit oleh tanda kurung siku atau [].

Ada berbagai macam cara menggunakan character classess ini, berikut penjelasannya.

RegexDeskripsi
[abc]Mencocokkan dengan huruf a, b, atau c.
[^abc]Mencocokkan dengan huruf selain a, b, atau c.
[a-z]Mencocokkan dengan huruf kecil a hingga huruf kecil z
[A-Z]Mencocokkan dengan huruf besar A hingga huruf besar Z
[a-Z]Mencocokkan dengan huruf kecil a hingga huruf Besar Z
[b-e]Mencocokkan dengan huruf kecil b hingga huruf kecil e
[0-9]Mencocokkan dengan angka 0 hingga 9
[a-z0-9]Mencocokkan dengan huruf kecil a hingga huruf kecil z atau dari angka 0 hingga angka 9

Sedikit penjelasan dari tabel di atas, untuk tanda ^ mempunyai arti kecuali/selain. Semisal ada regex [^jks], berarti selain huruf j, k, dan s adalah valid/cocok. Kemudian untuk tanda mempunyai arti range/rentang. Semisal ada regex [b-k], berarrti huruf b, c, d, e, f, g, h, i, j, dan k adalah valid/cocok.

Untuk memperjelas pemahaman teman-teman tentang character classes ini, coba perhatikan soal berikut.

Terdapat sebuah aplikasi untuk pemesanan makanan, kebetulan makanan yang dijual hanya tersedia bakso saja. Untuk memesan makanan ini, maka user harus memasukkan nama makanan diikuti jumlah makanan tersebut. Jumlah makanan yang boleh dipesan oleh user maksimal sebanyak 5 buah saja, sebagai contoh “bakso 5”. Kemudian ketentuan selanjutnya, penulisan huruf b di kata bakso boleh menggunakan b kecil atau B besar. Lalu untuk penulisan huruf a boleh diganti dengan 4 dan huruf o boleh diganti dengan 0. Cobalah buat regex untuk memvalidasi masukkan user sesuai dengan ketentuan tersebut.

Dan berikut adalah regexnya

/[bB][a4]ks[o0] [1-5]/

Untuk mempersingkat penulisan character classes, terdapat shortcut yang mewakili kombinasi karakter tertentu, simak tabel berikut untuk lebih jelasnya.

ShortcutDeskripsi
\dSama dengan [0-9]
\DSama dengan [^0-9]
\sMencocokkan dengan whitespace character(space, tab, new line, dan carriage return character) atau sama dengan [\t\n\r]
\SMencocokkan dengan selain whitespace character atau sama dengan [^\t\n\r]
\wSama dengan [a-zA-Z0-9_]
\WSama dengan [^a-zA-Z0-9_]
.Mencocokkan dengan semua karakter kecuali new line \n
//Contoh string
"8 merupakan bilangan cacah kurang dari 10"

//Regex
/[0-9] merupakan bilangan cacah kurang dari 10/

//Alternatif
/\d merupakan bilangan cacah kurang dari 10/

Contoh di atas hasilnya adalah valid untuk regex pertama dan alternatifnya, karena \d itu sama saja dengan [0-9].

Anchors

Anchor atau kalau diartikan dalam bahasa di Indonesia bisa berarti jangkar. Dalam context regex, anchor yang dimaksud adalah karakter yang posisinya berpengaruh terhadap pola regex.

Perhatikan tabel berikut untuk lebih jelasnya.

RegexDeskripsi
^Mencocokkan karakter dimulai dari awal string atau new line jika multi line flag (m) diberikan. Akan kita bahas nanti untuk flag.
$Mencocokkan karakter dimulai dari akhir string atau akhir new line jika multi line flag (m) diberikan.
\bMencocokkan karakter dimulai dari awal atau akhir setiap kata dalam sebuah string.
\BMencocokkan karakter selain dari awal atau akhir setiap kata dalam sebuah string.

Berikut contoh masing-masing dari regex di tabel di atas.

//^
//Contoh string
"kapak wiro sableng kapak 212"

//Regex
/^kapak/
//Hasil valid, karena kapak ada di awal string

//kapak di awal diganti dengan kepak
"kepak wiro sableng kapak 212"

//Regex
/^kapak/
//Hasil tidak valid, walaupun terdapat kata kapak di dalam string, namun tidak terletak di awal string
//$
//Contoh string
"lorem ipsum is lorem"

//Regex
/lorem$/
//Hasil valid karena terdapat kata lorem di akhir string

//lorem di akhir diganti dengan loram"
"lorem ipsum is loram"

//Regex
/lorem$/
//Hasil tidak valid, walaupun terdapat kata lorem di dalam string, namun tidak terletak di akhir string

\b dan \B bisa diletakkan di awal atau di akhir suatu regex, contoh /\bjaya\ atau /jaya\b/.

//\b
//Contoh string
"makan mangga sama mama papa"

//Regex
/\bma/g
// "g" adalah flag/modifier, akan saya bahas di nanti

Berikut hasilnya: makan mangga sama mama papa. Yang saya tebali itu artinya string yang cocok dengan regexnya. Jika diperhatikan, hanya ma di awal kata saja yang cocok, ma di kata “sama” tidak cocok. Jika regex diganti ke /ma\b/, maka hasilnya: makan mangga sama mama papa.

//\B
//Contoh string
"ali jadi atasan"

//Regex
/\Ba/g

Berikut hasilnya : ali jadi atasan. Jika diperhatikan, huruf a yang tebal adalah huruf a yang terletak selain di awal kata. Untuk yang \B di akhir regex dengan contoh string sama seperti di atas, maka semua huruf a akan cocok.

Quantifiers

Quantifiers ini membantu kita ketika dihadapkan dengan string yang mempunyai kombinasi huruf, suku kata atau kata yang berulang. Sebagai contoh ada kata “terlalu”, tentu sangat mudah jika kita harus membuat regex agar cocok dengan kata tersebut, tinggal buat saja /terlalu/. Tapi ada tambahan kondisi, buat juga regexnya agar dapat menerima kata “terlalu” tetapi dengan jumlah r tak terbatas, contoh : “terrrrrrrrrrrlalu”. Nah dalam kasus ini quantifiers bisa digunakan. Apa saja quantifiers yang bisa digunakan? Simak tabel berikut.

RegexDeskripsi
n+Mencocokan variabel n sebanyak minimal 1 sampai tak terhingga
n*Mencocokan variabel n sebanyak minimal 0 sampai tak terhingga
n?Mencocokan variabel n sebanyak minimal 0 sampai 1
n{x}Mencocokan variabel n sebanyak x
n{x,y}Mencocokan variabel n sebanyak minimal x sampai y
n{x,}Mencocokan variabel n sebanyak minimal x sampai tak terhingga
n adalah variabel yang bisa diganti dengan karakter
//n+
//string
"halooooooo"

//Regex
/halo+/
//Valid

//jika o dihilangkan
"hal"

//Regex
/halo+/
//Tidak valid, karena + menandakan minimal harus ada 1 o
//n*
//string
"halooooo"

//Regex
/halo*/
//Valid

//jika o dihilangkan
"hal"

//Regex
/halo*/
//Valid
//n{x}
//string
"haloooo

//Regex
/halo{4}/
//Valid

Grouping

Grouping diwakili dengan (). Karakter yang diapit oleh () akan dianggap satu group. Salah satu keuntungan grouping yaitu bisa dikombinasikan dengan quantifiers.

//string
"hahaha"

//Regex
/(ha){3}/

ha dalam () akan dianggap satu kesatuan, kemudian ditambahkan quantifiers {3} yang artinya dikalikan 3 kali maka menjadi hahaha.

Flags/Modifiers

Flags atau modifiers ini pada dasarnya berfungsi untuk mengatur keseluruhan pola. Flags terletak setelah delimiter penutup. Berikut beberapa flags yang ada beserta deskripsinya.

FlagsDeskripsi
iMeniadakan perbedaan huruf besar dan kecil. Jadi huruf besar dan kecil akan dianggap sama.
m\n akan dianggap sebagai new line dan akan berpengaruh pada ^ dan $
gBerfungsi untuk melakukan pencarian secara keseluruhan walaupun sudah ketemu yang cocok.
sIni akan membuat tanda . menjadi cocok dengan semua karakter dari yang sebelumnya tidak cocok dengan new line
//i
//Contoh string
"Budi"

//Regex
/budi/i
//Valid, karena perbedaan huruf besar dan kecil ditiadakan
//m
//Contoh string
"halo
hari ini cerah ya"

//Regex
/^h/g
//Yang cocok hanya huruf h di kata halo

//Regex multiline
/^h/gm
//Yang cocok adalah huruf h di kata halo dan huruf h di kata hari

Escaped Characters

Beberapa karakter seperti + ^ $ mempunyai fungsi dalam regex, sehingga jika ingin menggunakan karakter tersebut sesuai dengan wujud aslinya maka gunakan lah \ kemudian diikuti karakter tersebut. Selain itu juga ada beberapa escaped characters yang mewakili fungsi tertentu, mari kita lihat dalam tabel di bawah ini.

Escaped CharactersDeskripsi
\tMewakili tab
\nMewakili line feed / new line
\rMewaikili carriage return

Contoh Kasus

Email

//Case 1
/\w+@\w+\.\w+/

//Case 2
//dengan panjang minimal dan maksimal
/\w{5,25}@\w+\.\w+/

Nomor HP

Nomor hp dengan kode negara

//Case 1
//Nomor hp indonesia
//0812345678
/08\d{8,11}/

//Case 2
//Nomor hp indonesia dengan kode +62
//+62-812345678
/\+62-8\d{8,11}/

Tanggal Lahir

//22-09-2002
/(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-\d{4}/

Waktu

//05:32 Jam:Menit
/([0-1]\d|2[0-3]):([0-5]\d)/

Untuk contoh kasus di atas kemungkinan masih bisa diperbaiki lagi untuk menangani kemungkinan yang lain.


Sekian dulu penjelasan dari saya tentang regex. Tentunya yang saya bagikan disini ini tidaklah lengkap, namun saya kira sudah cukup untuk bisa memberikan gambaran kepada teman-teman tentang apa itu regex. Jika teman-teman ada pertanyaan atau masukkan, silahkan tinggal komentar di kolom komentar di bawah ya.

Terima kasih.

Share

You may also like...