0
0
0
share
#regular-expression
0 Komentar
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
0
0
0
share