Fundamental dari Regular Expression

Coba baca artikel yang sedang trending ini tentang belajar JavaScript di tahun 2016. Banyak buanget perkakas yang butuh untuk dipelajari padahal itu masih di ranah JavaScript saja, hanya dengan membaca artikel itu sudah kerasa akan seperti apa pusingnya ?

Tapi memang ngoding itu dekat dengan hal yang namanya pusing dan kalau kamu sudah berkomitmen masuk ke dunia IT berarti sudah siap dengan yang namanya pusing dan artikel tadi tidak membuat gentar.

Ilmu baru semakin banyak bermunculan padahal ilmu lama yang sifatnya penting dan tidak hanya berlaku untuk satu teknologi kadang masih belum kenal, contoh riilnya adalah regular expression.

Regular expression yang disingkat regex adalah sebuah ekspresi yang digunakan untuk mencocokan sebuah string apakah memiliki suatu pola yang kita definisikan atau tidak. Regex ini berlaku di semua bahasa pemrograman dan lumayan sering digunakan untuk pemrosesan string sehingga seharusnya yang namanya programmer wajib tahu, at least dasar-dasarnya.

Regex Paling Dasar

Yang paling dasar dari regex adalah sama saja kalau kita membandingkan apakah kedua string memiliki nilai yang sama. Misalnya yang biasa dilakukan dengan menggunakan if.

atau kalau di Java

Di regex, kalau kita membuat pola merah maka dia akan cocok dengan string yang berbunyi merah. Pola xxx akan cocok dengan string xxx dan begitu seterusnya. Sesederhana itu.

Regex sifatnya case sensitive sehingga android tidak akan cocok dengan Android.

Pencocokan regex di Ruby bentuknya seperti ini

Yup, menggunakan tanda garis miring untuk mengapit sebuah regex.

Pencocokan Karakter Tunggal

Kalau pakai if blok saja bisa lalu buat apa pakai regex?. Di sinilah asyiknya regex, dia tidak hanya bisa mencocokkan nilai string secara literal tapi juga bisa berdasarkan polanya. Mari kita belajar membuat pola dengan menggunakan tanda titik (.)

Tanda . digunakan untuk membuat sebuah pola yang bisa diisi oleh sebuah karakter apapun baik itu huruf;angka; maupun tanda baca seperti koma, titik dan lain sebagainya.

Dengan pengertian tersebut berarti poin-poin di bawah ini valid

– Pola . akan cocok dengan karakter tunggal apapun semisal R, !, @
– Pola .. akan cocok dengan dua buah karakter apapun misalnya Ag, 90, !{ tetapi tidak untuk X karena hanya terdiri dari satu karakter.

Satu pertanyaan, kalau kita punya pola 3.14 maka string apa yang akan cocok?.

Yes, 3.14, 3×14, 3914, 3+14 dan seterusnya semua akan cocok. Bagaimana kalau kita sebenarnya hanya menginginkan dalam string itu ada tanda titik yang sungguhan?. Gunakan tanda backslash untuk membuat escape character \.

3\.14 hanya akan cocok dengan string 3.14. Contoh lainnya adalah Mr\. Agung hanya cocok dengan Mr. Agung

Dengan bekal itu kita bisa bermain-main untuk membuat beberapa pola yang menyenangkan.

a...g bisa cocok dengan agung, abang, astig dst
...x akan cocok dengan 4 karakter di mana karakter terakhirnya adalah huruf x
.r\. Holmes bisa cocok untuk string Mr. Holmes maupun Dr. Holmes

Set

Kadang kita memang membutuhkan batasan. Tadi di atas, . membuat semua karakter yang ada bisa cocok. Jika kita menginginkan pembatasan maka kita bisa menggunakan karakter kurung siku [] yang mana di dalamnya hanya berisi karakter-karakter yang dibatasi.

– Regex [aiueo] hanya akan cocok dengan baik a, i, u, e maupun o.
[0123456789] hanya akan cocok dengan angka dari 0 sampai dengan 9

Perlu diingat bahwa set sama juga seperti ., hanya berlaku untuk satu karakter sehingga ae dianggap tidak cocok begitu juga dengan 69.

Tambahan informasi ini bisa membuat kita untuk menciptakan regex seperti [aA]gung [sS]etiawan yang akan cocok dengan nama saya baik itu menggunakan huruf kapital untuk awal kata maupun tidak. Cool isn’t it?

Pengembangan lain misalnya untuk memastikan ada dua buah digit bilangan heksadesimal menggunakan [0123456789abcdef][0123456789abcdef] seperti 2f, 5a, 8b dan tidak untuk 1o, 6p.

Range

Bagaimana kalau kita mau membuat hanya ada 2 buah karakter yang mana karakter pertama adalah a-z dan yang kedua 0-9?

Apakah seperti ini?
[abcdefghijklmnopqrstuvwxyz][0123456789]

Sangat tidak praktis, terlalu panjang. Kita bisa menggunakan range untuk cara yang jauh lebih gampang. Range ditandai dengan karakter -. Regex tadi bisa diubah menjadi seperti ini [a-z][0-9]. Mantep tho dek?

Regex untuk bilangan heksadesimal yang sudah ada pada bagian sebelumnya bisa kita ubah menjadi seperti ini sekarang

[0-9abcdef]
[0-9a-f]

Contoh lain untuk memastikan hanya ada huruf dan angka serta underscore [0-9a-zA-Z_]

Alternatif

Alternatif digunakan sebagai solusi andai kata yang kita inginkan bisa lebih dari satu bentuk. Misalnya adalah am|pm akan cocok dengan am maupun pm. Alternatif ditandai dengan karakter pipe |.

Alternatif mirip dengan penggunaan or. Kita ingin memastikan bahwa sebuah string bernilai admin atau administrator. Implementasi menggunakan blok if pada ruby adalah seperti ini.

Mengubah kode di atas dengan kali ini memanfaatkan regex hasilnya adalah

Cara ini belum tepat karena string bernilai admindong dan administratoraja masih bisa tembus. Begitu juga dengan dongadmin serta ajaadministrator. Nanti kita akan membahas soal ini.

Alternatif bisa menggunakan tanda kurung untuk memisahkan mana bagian yang menjadi alternatif dan mana yang bukan.

saya seorang (ruby|php) programmer akan cocok dengan saya seorang ruby programmer dan saya seorang php programmer.

Tanda * dan ?

Nah ini yang menurut saya merupakan tanda yang sifatnya dewa karena bisa membuat kita membentuk banyak pola.

* digunakan untuk membentuk suatu karakter yang jumlahnya antara 0 sampai banyak tak hingga di mana suatu tersebut adalah karakter yang berada di depan tanda *.

ag* akan cocok untuk a, ag, agg, aggg, aggggg dst.

ru*by berarti rby,ruby, ruuby,ruuuby cocok

Jika digabung dengan yang sudah kita pelajari di atas maka

– [aiueo]* adalah deretan huruf vokal sampai tak terhingga
– [0-9]* adalah angka sampai digit yang tak terhingga

Yang asyik adalah, karena . artinya semua karakter dan * membuat jumlahnya tak terbatas maka jika digabungkan menjadi .* artinya adalah apapun tak terbatas.

Salah satu contoh gampang adalah Agung .* yang berarti seseorang yang nama depannya Agung atau .* Setiawan, seseorang yang memiliki nama belakang Setiawan.

Tanda ? hampir mirip dengan * bedanya ada pada jumlah. ? jumlahnya antara 0 atau 1 beda dengan * yang 0 sampai tak terbatas.

Awal dan Akhir

Pada pembahasan sebelumnya ada satu penjelasan yang masih saya tahan dan di bagian ini akan saya jelaskan yaitu mengenai awal dan akhir dari suatu string.

Tadi masalahnya adalah admin|administrator akan cocok dengan string yang mengandung kata admin atau administrator sehingga menyebabkan string seperti adminaja, ajadminaja dst akan dianggap cocok dengan regex yang kita buat.

Supaya hanya benar-benar string admin dan administrator saja yang memenuhi regex maka kita perlu memberit tanda di mana awal dan di mana akhir dari string. Untuk itu digunakan ^ dan $.

^admin akan cocok dengan adminaja tetapi tidak untuk ajaadmin
admin$ akan cocok untuk ajadmin tetapi tidak untuk adminaja
^admin$ hanya akan membuat string admin saja yang lolos, tidak untuk adminaja, ajaadmin, ajaadminaja.

Dengan begitu berarti sekarang kode yang tadi digunakan untuk mengecek string user berubah menjadi

Tambahan, sebenarnya itu ^ dan $ adalah pembatas awal dan akhir untuk baris bukan string tetapi bisa digunakan untuk membatasi string juga.

Bedanya apa?

Untuk awal dan akhir string yang digunakan berturut-turut adalah \A dan \z.

Dan lain-lain

Beberapa bentuk ini gampang untuk dipahami jadi cuma saya tulis secara singkat.

+ untuk 1 atau banyak karakter. ba+ cocok dengan ba, baa dst tapi tidak jika hanya b
{} untuk jumlah spesifik
a{3} harus ada a sebanyak 3
a{3,} harus ada a sebanyak 3 atau lebih
a{3,9} harus ada a sebanyak 3 sampai dengan 9

Rekap

Saya rasa itu sudah cukup membekali kita untuk memahami regex. Mungkin masih ada beberapa lagi yang belum saya sebutkan dan silahkan menambahi kalau ada informasi yang masih kurang melalui komentar nanti akan saya tambahkan.

Facebook Comments
 

Agung Setiawan

Agung Setiawan adalah software engineer di BukaLapak.com, penulis sekaligus pecinta sastra, dan pembaca buku

 
Halo, perkenalkan saya Agung Setiawan.
Saya Software Engineer di BukaLapak.
Simak pemikian saya soal dunia Software Engineering via Twitter di @agungsetiawanmu dan facebook
Blog ini saya update seminggu sekali jadi sering-sering saja mampir
Mau belajar Vim bareng saya?
Belajar ngoding dari nol menggunakan PHP

One thought on “Fundamental dari Regular Expression

Leave a Reply

Your email address will not be published. Required fields are marked *