Mengenal Regular Expressions

Bagus Aji Santoso 22 November 2017

Mengenal Regular Expressions

Pendahuluan

Sebagai seorang system administrators, developers, QA engineers, atau support engineers kita sering kali perlu mencari data dengan pola tertentu misalnya sekelompok IP addresses dalam kisaran tertentu atau terkadang kita juga perlu mencari kata yang salah tulis. Untuk kasus-kasus seperti ini, regular expression dapat membantu.

Regular expressions adalah template untuk data berdasarkan pola tertentu. Tutorial ini akan mendemonstrasikan kemampuan regular expression tanpa bergantung pada bahasa pemrograman tertentu dengan menggunakan egrep untuk menjelaskan konsepnya.

Regular Expressions

Regular expressions terdiri dari dua tipe:

  • literal characters dan
  • metacharacters

Metacharacters adalah tipe yang membuat regular expression unggul dibanding solusi lain.

Anggap kita memiliki sebuah file bernama country.txt dimana kolom pertama merupakan nama negara, kolom kedua jumlah populasi, dan kolom ketiga merupakan benua tempat negara tersebut berada (ditulis dalam bentuk csv)

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Anchor Metacharacters

Kelompok "metacharacter" yang akan kita bahas adalah ^ dan $. ^ dan $ akan mencocokkan bagian awal dan bagian akhir dari suatu pola (pattern) dan disebut dengan anchor metacharacters.

Untuk mencari tahu nama seluruh negara dengan huruf pertama I, kita akan menggunakan:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

atau untuk mencari negara yang berada di sebuah benua yang diakhiri dengan huruf e, kita akan tuliskan:

or to find out all the countries which have continent names ending with e, we do:

$ egrep 'e$' country.txt
Italy,57634327,Europe

Metacharacter selanjutnya adalah dot alias titik (.) yang akan mencocokkan satu karakter untuk setiap titik. Misalnya, kita ingin mencari negara yang terdiri dari 5 karakter, maka kita akan tuliskan:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

Bagaimaan untuk mencari negara yang terdiri dari 5 karakter namun hanya mereka yang dimulai dengan huruf I atau J?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[...] dinamakan a character set atau character class. Di dalam sebuah character set, hanya satu regular expression hanya akan mencocokkan salah satu karakter.

Tanda ^ di dalam sebuah character set akan membalikkan hasilnya. Contoh berikut akan mecocokkan nama karakter yang terdiri dari lima karakter panjangnya tapi tidak dimulai dengan I atau J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

Grouping Metacharacter dan Alternation

Untuk mencari baris yang terdapat kata Asia atau Africa:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Cara di atas juga dalam dilaukan dengan perintah berikut:

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Quantifiers

Daripada menuliskan:

$ egrep '^[IJ]....,' country.txt

kita dapat menyingkatnya menjadi:

$ egrep '^[IJ].{4},' country.txt

tanda {} disebut sebagai quantifiers. Mereka menentukan berapa kali sebuah karakter akan dicocokkan. Pada contoh di atas, daripada menuliskan titik empat kali, kita bisa menulis titik satu kali diikuti quantifiers dengan angka tertentu.

Kita juga dapat menuliskan jarak dengan quantifiers:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Perintah di atas hanya akan mencocokkan nama negara yang dimulai dengan I atau J dan memiliki 4 sampai 6 karakter di dalamnya.

Ada beberapa shortcut lain yang tersedia untuk quantifiers. Misalnya, {0.1} sama dengan tanda ?.

$ egrep '^ab{0,1}c$' filename

sama dengan

$ egrep '^ab?c' filename

{0,} sama dengan *

$ egrep '^ab{0,}c$' filename

sama dengan

$ egrep '^ab*c' filename

{1,} sama dengan +

$ egrep '^ab{1,}c$' filename

sama dengan

$ egrep '^ab+c' filename

Mari kita lihat contoh lain menggunakan ekspresi yang sudah kita pelajari. Di sini kita tidak melakukan pencarian dari sebuah file, tapi kita mencari dari standard input (kita akan tuliskan secara manual kalimatnya). Apabila dari kalimat yang ditulis hasilnya sama dengan pola yang ditentukan, maka kalimat tersebut akan dicetak ulang.

Pada contoh di bawah ini kita ingin mencari kalimat yang akan cocok dengan the grey color suit was his favourite atau the gray colour suit was his favorite

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

Dari ekspresi di atas kita bisa tahu bahwa:

  • grey dapat ditulis grey atau gray
  • colour dapat ditulis colour atau color, karena u opsional kita bisa menuliskan u?
  • begitu pula dengan favourite atau favorite dapat ditulis favou?rite

Bagaimana jika ingin mencair pola kode pos Amerika?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

Satu contoh lagi yang akan mencocokkan waktu yang valid dalam pola 24 jam.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

Pada contoh di atas, kita mengatakan bahwa digit pertama harus 0 atau satu, lalu digit yang kedua antara 0 sampai 9. Tapi, jika digit pertama 2, maka nilai digit kedua hanya boleh antara 0 sampai 3 (perhatikan tanda |)

Word Boundary

Untuk mencari pola yang berakhir dengan kata color misalnya unicolor, watercolor, multicolor dll.

$ egrep 'color\>'

Lalu, untuk mencari kata yang dimulai dengan kata color seperti colorless dan colorful, tapi tidak cocok dengan unicolor, watercolor, multicolor, dll.

$ egrep '\<color'

Jika hanya ingin mencocokkan kata color tanpa awalan atau akhiran:

$ egrep '\<color\>'

Backreferences

Misalnya lagi, kita ingin mencocokkan semua kata yang ditulis dua kali seperti the the atau before before, kita akan harus menggunakan backreferences. Backreferences dipakai untuk mengingat pola. Berikut contoh untuk mencari kata the the

$ egrep "\<the\> \1"

atau untuk mencari semua kata yang berulang:

$ egrep "\<(.*)\> \1"

Contoh di atas dapat diaplikasikan saat kita ingin mencari nama yang memiliki nama depan dan nama belakang yang sama.

Semoga bermanfaat dan jika terdapat kesalahan, mohon dikoreksi.

*Diterjemahkan dari An Introduction To Regular Expressions *

Gambar sampul: lazybatman