Halaman

Senin, 10 Agustus 2015

Belajar Regex

Steven Haryanto
Bagian: 1—Pengenalan dan Karakter Meta Sederhana
Tingkat: Dasar
Tujuan: Setelah membaca bagian pertama ini, pembaca diharapkan memahami beberapa metakarakter regex sederhana: dot, set karakter, alternasi, jangkar, shortcut quantifier +, *, ?, serta pengelompokan.
Abstrak: Apa itu regular expression (regex), mengapa regex perlu, beberapa contoh awal.
Prasyarat: Kenal dengan salah satu bahasa pemrograman Perl, PHP, atau Python. Ini tidak wajib, tapi akan membantu dalam memahami contoh-contoh.
Kuis berhadiah BMW portal Astaganaga.com hari ini ditutup dan akan diundi dua minggu lagi. Ternyata jumlah formulir yang disubmit mencapai lebih dari 40 ribu! Sukses besar. Kebetulan, karena Anda seorang programer PHP yang telah mengerti tentang SQL dan RDBMS (meskipun hanya MySQL), data tiap formulir online sudah masuk semua dengan rapi ke database. Dengan bangga Anda membuka browser dan mengakses URL phpMyAdmin dan bermaksud melihat-lihat data yang telah terkumpul.
Nama propinsi kebetulan seragam semua, karena Anda telah membuat field isian berupa kotak select, sehingga pengisi formulir tinggal memilih dari daftar propinsi yang disediakan. Tapi, wah, ternyata nama kota
cukup bervariasi karena di formulir berupa kotak isian. Banyak sekali terjadi salah ketik: “Jakrta”, “Seamrng.” Ada yang menulis dengan singkatan “DKI” atau “Bdg.” Ada pula yang berbaik hati menuliskan lengkapnya, “Jakarta Barat” atau malah “Kotamadya Bogor.” Dan ternyata Anda lupa melakukan pengecekan kode pos, sehingga ada sebagian yang salah, atau mungkin iseng, mengisi dengan huruf “tidak ada” atau “-” atau deretan huruf tertentu. Belum lagi alamat jalan, bervariasi sekali.
Repotnya, sang bos ternyata meminta data ini dirapikan sebaik-baiknya, karena akan disusun menjadi database alamat yang mungkin bisa berguna di kemudian hari. Untuk mengirim penawaran via pos—alias junk mail—misalnya, atau malah daftar ini untuk dijual ke perusahaan lain. Dan karena Anda yang menyusun databasenya, Anda pulalah yang ketiban tugas merapikannya.
Bos juga minta penulisan alamat sestandar mungkin. Semua dijadikan huruf besar. prefiks “Jalan” harus disingkat menjadi “Jl.” Gang menjadi Gg. Dan sudah pasti nama-nama kota harus dibetulkan. Salah Anda sendiri sebetulnya, kenapa tidak menyediakan daftar kota dari database. Tapi kesalahan selalu bisa terjadi toh.

Solusi Non-Regex

Oke, tugas pertama mengkonversi ke huruf kapital cukup mudah. Anda programer PHP, jadi Anda tinggal menggunakan fungsi builtin strupper().
# Langkah 1


$alamat = strupper($alamat);
Sampai di sini alamat telah berubah menjadi string berhuruf besar semua. Hei, sebentar dulu. Ternyata ada alamat yang diawali spasi. Berarti, Anda perlu menghilangkan dulu semua spasi di awal. Untungnya di PHP tersedia fungsi ltrim().
# Langkah 0


$alamat = ltrim($alamat);
Wah, ternyata Anda menyadari banyak juga yang mengetik spasi ganda bahkan tiga empat kali. Kok bisa ya? Bagaimana cara membetulkannya?
# Langkah 0.2


while (1) {


    $alamat2 = str_replace("  ", " ", $alamat);


    if ($alamat2 == $alamat)


         break;


    else


         $alamat = $alamat2;


}
Kode di atas mengubah string ganda (dua buah spasi) menjadi satu spasi terus-menerus hingga sudah tidak ada lagi string ganda.
Tugas berikutnya menyingkat Jalan dan Gang. Sekali lagi, karena Anda programer PHP, Anda tinggal menggunakan fungsi string yang telah disediakan, str_replace().
# Langkah 2.1


$alamat = str_replace("JALAN", "JL.", $alamat);
Mudah ya? Satu lagi:
# Langkah 2.2


$alamat = str_replace("GANG", "GG.", $alamat);
Hm, tapi ternyata ada jalan di Jakarta bernama Ganggeng. Seorang Ibu Anwar misalnya, tinggal di “Jalan Ganggeng 15.” Tentu saja tidak boleh diubah menjadi Gg.geng bukan? Bagaimana solusinya? Kita hanya boleh mengubah “Gang” yang berada di awal string. Untuk mengetahui posisi string dalam string lain, gunakan fungsi strpos(). Jika fungsi ini mengembalikan nilai 0, maka string yang dicari ada di awal.
# Langkah 2.2b


if (strpos($alamat, "GANG") === 0) {


    $alamat = "GG." . substr($alamat, 4);


}
Ternyata belum benar. Ada seorang Bapak yang beralamat di “Jalan Kehakiman, Gang Haji Umar no. 14.” Uji yang tepat sebetulnya adalah mencari kata “Gang” yang berdiri sendiri, bukan bagian dari sebuah kata. Bagaimana caranya?
# Langkah 2.2c


$ALFABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";


$ganti = false;


if (($pos = strpos($alamat, "GANG")) !== false) {


    # kata "GANG" berdiri sendiri jika terdapat di awal atau di akhir


    # string, atau dibatasi spasi atau tanda baca.


    if ((($pos == 0) or


         (strpos($ALFABET, substr($alamat, $pos-1, 1)) === false))


        and


        (($pos + 4 == strlen($alamat)) or


         (strpos($ALFABET, substr($alamat, $pos+4, 1)) === false))


       ) $ganti = true;


}


if ($ganti)


    $alamat = substr($alamat, 0, $pos) . "GG." .


              substr($alamat, $pos+4);
Kode di atas pertama-tama mencari potongan “GANG”. Jika ditemukan, maka dilakukan pengujian sekali lagi apakah satu karakter di kiri dan di kanan “GANG” bukan sebuah huruf. Jika benar, maka barulah dilakukan penggantian.
Ternyata derita Anda belum berakhir sampai di sini. Entah mengapa, banyak sekali yang mengeja “Gang” dengan “Gank” dan “Geng”. Terpaksa menambahkan potongan-potongan kode lagi ke kondisi pengujian sebelumnya. Belum lagi Anda masih harus membetulkan nama kota dan kode pos. Semakin banyak saja Anda harus memotong-motong dan menggabungkan string, mencari string di string lain, melakukan loop, pengujian, dsb. Duh, merepotkan! Lama-lama Anda jadi mempertimbangkan untuk mengedit langsung saja semua data tersebut secara manual.
Contoh kasus di atas hanyalah secuil dari tugas mengolah teks. Tugas lainnya kadang jauh lebih kompleks. Mengerikan. Apakah mengolah teks harus bertele-tele dan merepotkan seperti contoh di atas?

Kenalkan, Regex

Jawabnya, untung saja, tidak. Ada sebuah bahasa mini yang disebut regular expression (regex) yang akan Anda pelajari sesaat lagi. Regex adalah sebuah fasilitas yang ampuh, yang memungkinkan Anda mengolah teks secara jauh lebih ringkas, tidak bertele-tele. Tanpa regex, rasanya pengolahan teks tingkat lanjut itu tidak terbayangkan repotnya. Bahkan, jika Anda buta regex, maka kemampuan mengolah teks Anda akan terus berada di tingkat taman kanak-kanak. Dengan menguasai regex, Anda akan memandang teks dalam kacamata yang baru. Anda akan lebih lihai dan lancar dalam memainkan huruf dan angka, potongan dan kata, baris dan paragraf teks. Anda tidak akan takut lagi menghadapi data yang menyimpang atau aneh-aneh. Anda akan terlatih menemukan pola dari ketidakteraturan. Pendek kata, sekali mengenal regex—bolehlah penulis sedikit berlebihan di sini—hidup Anda tidak akan sama lagi!
Pengetahuan regex juga amat berguna, karena dipakai di mana-mana. Bukan hanya di Perl, yang amat intensif menggunakan regex, tapi juga di bahasa pemrograman lain mulai dari Python hingga Java, dari Javascript hingga VB. Bukan hanya di Unix dengan utilitas-utilitas grep dan awk-nya, tapi juga di Windows dan OS lain dalam berbagai program. Misalnya akan Anda jumpai di editor teks (seperti vi dan joe), di file konfigurasi berbagai daemon dan utilitas (seperti procmail, exim, dan Apache), bahkan di aplikasi seperti Microsoft Word dan Borland Delphi regex pun tak luput dikenali. Intinya, pengetahuan regex Anda akan sangat portabel dan terpakai.
Tertarik? Tentu. Jadi mari kita lanjutkan.

Wildcard

Anda yang pernah memakai DOS atau Linux tentunya familiar dengan wildcard—atau globbing jika di Unix. Wildcard adalah sebuah string pola yang dapat digunakan untuk dicocokkan dengan sekumpulan nama file dan direktori. Misalnya: *.exe akan cocok dengan semua file berekstensi .exe. Karakter khusus wildcard ‘*’ di sini berarti cocok dengan deretan satu atau lebih karakter apa saja. Contoh lain, ???.txt akan cocok dengan tiap file .txt yang namanya terdiri dari tiga huruf.

Latihan 1

Jawaban ada di akhir tulisan.
  1. Apa wildcard dari “semua nama file berekstensi apa saja”?
  2. Apa wildcard dari “Semua file ZIP yang berawalan A, B, dan C”?
  3. Apakah akan F*.* cocok dengan nama file FileSaya di DOS/Linux? Bagaimana dengan f*?
Wildcard bisa dibilang bentuk primitif mirip regex. Namun regex jauh lebih ampuh dan ekspresif daripada wildcard, dapat menyatakan pola-pola yang lebih kompleks.

Pemilihan, Pengelompokan, Set, dan Opsional

Sama seperti wildcard, regex pun adalah sebuah string pola. Pola yang akan dicocokkan oleh komputer dari kiri ke kanan. Pola regex “satu” misalnya, cocok dengan string “satu” dan tidak dengan string “dua”. Tidak ada bedanya dengan operasi pembandingan string biasa bukan?
Beberapa karakter dalam sebuah pola regex akan diartikan secara khusus. Karakter-karakter ini disebut karakter meta (alias, bukan yang sesungguhnya). Ini sama seperti karakter * dan ? di wildcard yang bukan diartikan sebagai karakter literal bintang dan tanda tanya itu sendiri, melainkan berarti khusus. Demikian juga karakter-karakter meta.
Jika wildcard di DOS hanya mengenal dua karakter meta, ? dan *, dan itu pun tidak fleksibel, maka dalam bahasa regex standar umumnya dikenal beberapa jenis karakter meta lain. Berikut ini beberapa karakter meta dasar.
  • | (garis vertikal) untuk pemilihan;
  • ( dan ) (kurung buka dan kurung tutup) untuk pengelompokan;
  • [ dan ] (kurung siku buka dan tutup) untuk membuat set karakter;
  • ? (tanda tanya) untuk mengartikan opsional.

Kasus 2: Berbagai Cara Mengeja Nama

Punya nama yang, ehem, keren belum tentu sepenuhnya berkah. Banyak juga yang salah mengeja nama saya. “Steven” kadang-kadang ditulis orang “stephen”, kadang juga “stefen”—meski lebih jarang. Bagaimana mencari semua kemungkinan orang menulis nama itu?
if (strpos($nama, "steven") !== false or


    strpos($nama, "stephen") !== false or


    strpos($nama, "stefen") !== false) {


    # lakukan sesuatu di sini


}
Tapi, ada juga ternyata yang menulis “stefan”. Jika kita kombinasikan semua kemungkinan, maka kini ada 3×2 variasi. Lalu pernah juga ada dokter yang menulis nama saya “stefanus” atau “stevanus” di kartu pasiennya. Nama belakang “haryanto” saya pun pernah ditulis “harijanto”, “hariyanto”, atau “herjanto”. Berarti ada puluhan kombinasi sekarang. Apakah kita harus terus-menerus memperpanjang perbandingan dengan sekian belas fungsi strpos() dan operator or? Tentu tidak, kan sudah ada regex.
ste(v|f|ph)[ea]n(us)? h[ae]ri?[jy]anto
Wuih, tunggu dulu. Regex seperti itu? Mengerikan juga. Tenanglah. Regex itu harus dipandang sebagai teman. Notasinya memang ringkas sekali, tapi keringkasan justru menjadi salah satu keunggulan regex. Jika mata Anda sudah terbiasa, semoga akan bisa lebih cepat dan mudah memahami sebuah pola regex. Pola di atas tadi terdiri dari beberapa karakter meta. Kita bahas satu-persatu.

Pemilihan

| disebut juga alternasi atau pemilihan. Dapat dibaca sebagai “atau”. Gunanya untuk memilih satu dari dua atau lebih alternatif yang kita sediakan. Beberapa contoh:
  • aku|kamu, cocok dengan aku atau kamu, tapi tidak dengan dia;
  • apel|anggur|pisang, cocok dengan salah satu dari apel, anggur, atau pisang, tapi tidak dengan jambu karena itu tidak ada dalam daftar pilihan.

Pengelompokan

( dan ) berguna untuk mengelompokkan, persis seperti tanda kurung dalam operasi matematika. Umumnya dipakai bersama karakter meta lain. Contoh:
  • satria (baja hitam|pembela kebenaran) akan cocok dengan “satria baja hitam” atau “satria pembela kebenaran”. Regex ini berbunyi sebagai berikut: “deretan huruf ‘satria’ diikuti spasi dan diikuti ‘baja hitam’ atau ‘pembela kebenaran’.

Set karakter

[ dan ] mengapit sebuah set karakter. Pada dasarnya berguna untuk memberi pilihan juga, sama seperti |, namun memiliki perbedaan pilihannya berupa huruf dan memiliki sintaks rentang dan negasi. Sintaks rentang adalah [m-n] dan akan cocok dengan karakter mulai dari m hingga n. Sintaks negasi adalah [^m] dan akan cocok dengan semua karakter kecuali m. Berikut beberapa contoh set.
  • bat[aoiu]k, cocok dengan batak, batok, batik, atau batuk.
  • bat(a|i|o|u)k, sama dengan sebelumnya, namun menggunakan |.
  • [0-9], cocok dengan angka 0 hingga 9.
  • [A-EG-Z], cocok dengan semua huruf besar kecuali F.
  • [0-9][0-9], cocok dengan `00’ hingga ‘99’ (100 kombinasi).
  • [012][0-9], cocok dengan ‘00’ hingga ‘29’ (30 kombinasi)
  • [012][0-9]|30, cocok dengan ‘00’ hingga ‘29’ atau ‘30’ (30 plus 1 kombinasi)
  • sem([ui]|bilan), cocok dengan semi, semu, atau sembilan. Tidak cocok dengan semibilan, semubilan, maupun semuibilan.

Opsional

Arti ? di regex berbeda dengan di wildcard. Di regex, ? berarti huruf atau kelompok di kiri bersifat opsional. Dapat juga dibaca sebagai “boleh ada atau boleh tidak.” Beberapa contoh:
  • silah?kan, cocok dengan silakan atau silahkan.
  • (silah)?kan, cocok dengan silahkan atau dengan kan saja.
  • advi([sc]es?|sory), cocok dengan advice, advise, advices, advises, atau advisory. Regex ini berbunyi “empat huruf advi diikuti dengan salah satu dari: a) huruf s atau c yang diikuti e dan boleh diikuti s; atau b) deretan huruf sory.”
Jadi kembali ke kasus variasi ejaan nama, regex kita berbunyi demikian: “Tiga huruf ste diikuti salah satu dari v, f, atau ph; diikuti salah satu dari e atau a; diikuti huruf n; boleh diikuti ‘us’, tapi boleh juga tidak. Diikuti spasi dan deret tiga huruf har; boleh diikuti huruf i, dapat juga langsung diikuti salah satu dari huruf j atau y. Terakhir, diikuti oleh deret empat huruf anto.” Karena ringkas, seluruh kalimat keinginan kita tadi dapat dinyatakan hanya dengan satu pola regex! Dengan regex, kita dapat mempersingkat mungkin puluhan baris if-or menjadi hanya satu baris kode PHP:
if (preg_match("/ste(v|f|ph)[ea]n(us)? h[ae]ri?[jy]anto/", $nama)) {


    # lakukan sesuatu di sini


}
Pada dasarnya regex bisa menyingkat 100 atau lebih baris kode menjadi hanya satu pola. Singkat berarti lebih cepat ditulis, lebih mudah dikopi-paste, lebih sedikit kemungkinan salah. Regex juga lebih gampang dibuat ketimbang kode yang sepadan.
Perhatikan bahwa pola regex kita dalam kode PHP di atas diapit oleh dua garis miring. Kegunaan pengapit ini dan lebih jauh mengenai fungsi preg_match() akan dibahas nanti. Dalam Perl, sintaksnya seperti ini:
if ($nama =~ /ste(v|f|ph)[ea]n(us)? h[ae]ri?[jy]anto/) {


    # lakukan sesuatu di sini


}
Karena regex begitu terintegrasi dengan Perl, maka Perl memiliki beberapa operator khusus untuk regex. Pengapit // disebut operator m//. Terdapat pula satu operator pengutip literal regex lain yaitu qr//. Pola regex dalam Perl tidak perlu diapit lagi dengan kutip string, cukup dengan salah satu pengutip regex tadi (m// atau qr//). Untuk melakukan perbandingan regex, digunakan operator =~.
Sementara di PHP pekerjaan yang berkaitan dengan regex dilakukan melalui fungsi-fungsi preg_*().

Latihan 2

  1. Seperti apa regex yang berbunyi “satu hingga tiga deret karakter a baik huruf besar maupun kecil”?
  2. Bagaimana mencocokkan karakter yang bukan huruf kecil?
  3. Bagaimana mencocokkan string angka ‘15’ hingga ‘51’ dengan regex?
  4. Bagaimana mencocokkan dengan tepat string-string anting, ranting, dan ranjang dengan seringkas-ringkasnya?
  5. Apakah [AS][US][AS] cocok dengan USA?
  6. Apakah (Mega|Rahma)wati cocok dengan Ibu Megawati? Dengan Mega?
  7. Apakah Saya( bukan)? pembohong. cocok dengan saya pembohong.?

Titik, Nol-Atau-Lebih, Satu-Atau-Lebih, Jangkar

Berikut ini empat lagi karakter meta dasar lain.
  • . (titik) cocok dengan satu karakter apa pun;
  • (bintang) untuk mengartikan “nol atau lebih”;
  • + (plus) untuk mengartikan “satu atau lebih”;
  • ^ (tanda pangkat) dan $ (dolar) untuk penjangkaran.

Titik

Titik atau dot adalah lambang yang cocok dengan semua karakter tunggal. Beberapa contoh:
  • bat.k cocok dengan batak, batok, dan juga batbk, bat+k, bat8k, dsb. Namun tidak cocok dengan batrak (karena tr adalah dua karakter) atau batk (nol karakter).
  • bat.?k sama seperti sebelumnya, namun cocok pula dengan batk (nol karakter) karena titik diikuti oleh tanda opsional.
  • b...k cocok dengan lebih banyak lagi string, mulai dari batak, buruk, bilik, dan semua potongan string yang terdiri dari 5 karakter, diawali dengan b dan diakhiri dengan k.

Nol-Atau-Lebih, Satu-Atau-Lebih

Kalau tanda optional ? bisa dibilang sebagai “nol-atau-satu”, maka * melambangkan “nol-atau-lebih” dan + melambangkan “satu-atau-lebih” dari karakter atau kelompok yang berada tepat di kiri tanda tersebut. Beberapa contoh:
  • [0-9]+, cocok dengan deretan angka.
  • .+, cocok dengan satu atau lebih karakter apa pun, atau cocok dengan string yang “tidak kosong”.
  • .*, cocok dengan nol atau lebih karakter apa pun, atau cocok dengan string apa saja, termasuk juga yang kosong.
  • h?(ah|eh)+!*, berbunyi “boleh diawali huruf h, terdiri dari deretan ah atau eh, dan boleh diakhiri dengan deretan tanda seru.” Cocok dengan string seperti eh, hahahah!, atau ehehahehah!!!. Tidak cocok dengan string seperti haha, hhah!, maupun h!.

Jangkar

^ dan $ masing-masing dapat disebut sebagai “harus di awal” dan “harus di akhir.” Mengapa disebut jangkar? Kedua karakter ini tidak melambangkan karakter mereka sendiri, ingat, keduanya adalah karakter meta. Bahkan ^ dan $ di sini tidak melambangkan karakter apapun, melainkan mensyaratkan posisi atau penambatan pola ke string yang ingin dicocokkan. Itulah sebabnya pasangan karakter meta ini disebut anchor, atau jangkar. Beberapa contoh:
  • 456 cocok dengan 456, 456789, maupun 123456 karena ketiganya mengandung pola tersebut.
  • ^456 cocok dengan 456, 456789, namun tidak cocok dengan 123456.
  • ^456$ hanya cocok dengan 456, tidak dengan 456789 maupun 123456.
Pola seperti [0-9][0-9] dan pola-pola lain di contoh sebelumnya bersifat tidak terjangkar karena tidak diberi ^ maupun $. Jadi di mana pun pola tersebut ditemukan di dalam string—di awal, tengah, maupun ujung akhir—tetap akan cocok. Sementara jika sebuah pola terjangkar, maka hanya cocok di awal atau di akhir atau awal-dan-akhir, bergantung pada jenis jangkar yang diberikan pada pola.

Latihan 3

  1. Bagaimana pola sebuah bilangan bulat positif? Bulat negatif? Desimal positif/negatif?
  2. Bagaimana regex yang berbunyi “mengandung string aku”?
  3. Bagaimana regex yang berbunyi “tepat string aku”?
  4. Bagaimana regex yang berbunyi “diakhiri string aku”?
  5. Bagaimana regex untuk mencocokkan nama variabel dalam PHP atau variabel skalar Perl?
  6. Apakah ^(Mega|Rahma)wati cocok dengan Ibu Megawati?
  7. Apakah [^k]apuk cocok dengan bunga kapuk yang mulai lapuk?
Sampai di sini dulu. Sampai jumpa di bagian berikutnya.

Jawaban Latihan

Latihan 1

  1. *.*
  2. Wildcard di Linux lebih ampuh daripada di DOS. Selain karakter khusus * dan ?, shell Linux mengenali set karakter []. Untuk menyatakan kumpulan file ZIP berawalan A, B, dan C, Anda dapat menggunakan pola [ABC]*.ZIP di Linux. Sementara di DOS Anda perlu membuat tiga wildcard terpisah: A*.ZIP, B*.ZIP, C*.ZIP.
  3. Pertanyaan ini sedikit menjebak. Kelakuan wildcard di Linux dan di DOS agak berbeda. Wildcard pertama, F*.* akan cocok dengan file FileSaya di DOS. Namun di Linux, wildcard ini berarti “File yang diawali huruf F dan mengandung titik di tengahnya.” Jadi jika nama file FileSaya.doc misalnya, maka wildcard akan cocok di Linux. Tapi jika tanpa ekstensi—yang berarti tanpa karakter titik—maka tidak akan cocok. Wildcard kedua pun hanya cocok di DOS. Ingat, Unix membedakan huruf besar dan kecil. Karena wildcard diawali huruf f kecil, maka tidak akan cocok di Linux.

Latihan 2

  1. [Aa][Aa]?[Aa]?
  2. [^a-z]. Catatan, ini berarti angka, simbol, maupun huruf besar cocok dengan pola ini. Karena semuanya bukan huruf kecil.
  3. 1[1-5]|[234][0-9]|5[01]
  4. r?anting|ranjang. Pola r?an(ting|jang), meskipun lebih ringkas, tidak dapat digunakan karena cocok juga dengan anjang, padahal itu tidak kita inginkan. Sementara pola ranting|anting|ranjang juga dapat digunakan, tapi tentunya itu bukan yang pola yang terpendek.
  5. Ya.
  6. (Mega|Rahma)wati cocok dengan Ibu Megawati, tapi tidak dengan Mega, karena string yang kedua tidak mengandung wati.
  7. Pertanyaan ini sebuah jebakan. Regex secara default membedakan huruf besar dan kecil. Karena itu Saya( bukan)? pembohong. tidak cocok dengan saya pembohong..

Latihan 3

Bilangan bulat positif: [0-9]+. Bulangan bulat negatif: -[0-9]+. Sebuah bilangan positif juga dapat diberi tanda positif di depan angkanya. Karena + adalah sebuah karakter meta, maka kita dapat memasukkannya ke dalam set atau mengawalinya dengan \ (garis miring terbalik, backslash) untuk membuatnya menjadi bermakna literal. Contoh: [+]?[0-9]+ atau \+?[0-9]+.
Kedua pola di atas dapat digabung menjadi pola untuk “bilangan bulat”: [+-]?[0-9]+.
Bilangan desimal adalah bilangan bulat yang diikuti koma desimal. Polanya adalah sebagai berikut: [+-]?[0-9]+(,[0-9]+)? Atau bisa juga ditulis tanpa pengelompokan dengan pola ini: [+-]?[0-9]+,?[0-9]*. Perhatikan bahwa koma desimal bersifat opsional.
aku
^aku$
aku$
Sebuah variabel dalam PHP diawali dengan karakter $ dan diikuti dengan huruf besar, huruf kecil, atau garis bawah (_) namun tidak boleh angka. Huruf kedua dan seterusnya dapat berupa huruf, garis bawah, atau angka. Sebuah variabel dapat terdiri dari satu atau lebih karakter. Polanya adalah sebagai berikut: $[A-Za-z_][A-Za-z_0-9]* Perhatikan bahwa karakter $ di awal pola bukanlah karakter meta. Karakter meta memiliki arti khusus hanya dalam konteks khusus saja. Jika karakter $ tidak ditaruh di akhir pola, maka tidak berarti jangkar, melainkan karakter literal biasa.
Tidak. Karena pola berjangkar, maka potongan Mega atau Rahma harus terdapat di awal string yang ingin dicocokkan. Dalam kasus ini, tidak cocok karena awal string adalah Ibu.
Ya. Tepatnya, cocok dengan lapuk. Sekali lagi, perhatikan karakter meta bergantung pada konteks. Di dalam [ ] kebanyakan karakter meta menjadi bermakna literal. Dalam kasus kita, karakter meta ^ jika di awal pola berarti jangkar, namun di awal set berarti negasi. Maka pola [^k]apuk bertugas mencari potongan string yang bukan diawali huruf k kecil dan diikuti apuk. Potongan string lapuk cocok dengan pola ini.

1 komentar:

  1. kasian penulis aslinya gak di sertakan di sumber :(

    http://www.master.web.id/mwmag/issue/01/content/tutorial-regex-1/tutorial-regex-1.html

    BalasHapus