Mengenal Regular Expression di Emacs
Beberapa waktu ini saya belajar autolisp lagi, dulu kayaknya autolisp ini biasa saja. apalagi sebagai script/bahasa pemrograman dengan sintak kurung buka "(" dan kurung tutupnya ")" sering bikin pusing debuggingnya. Juga, Blade nya Bricscad tidak built in,eh ternyata di tempat kerjaan dengan versi 2018nya sudah ada IDE begini, kan jadi tertarik lagi.
Mulai ngoprek Autolisp lagi (meskipun ya kemampuannya begini-begini saja), membawa saya tertarik ke bahasa induknya "lisp". Iseng-iseng install Portacle dengan Steel Bank Common Lispnya, eh editor ini ternyata membuat semakin penasaran. Istilah-istilahnya yang baru (dan mungkin sedikit beda dengan aplikasi Windows karena dulunya aplikasi Emacs ini bukan lahir di OS tertutup ini) dan shortcutnya juga sama sekali membuat bikin pusing.
Menarik sekali ketika membuka "GNU Emacs -Guided Tournya" di bagian Regular expression search-nya. Agar ketika ingin me-refresh lagi tidak usah menterjemah dengan Translate-nya mbah Google, berikut hasil terjemah tentang Regular expression di Emacs, tentu dengan sedikit perubahan agar ketika membaca kembali tidak balik lagi ke versi bahasa aslinya.
alamat aslinya disini ya : https://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html
Regular expression memiliki sintaks di mana beberapa karakter merupakan konstruksi spesial dan sisanya merupakan karakter biasa. Karakter biasa sesuai dengan karakter tersebut dan tidak ada yang lain. Karakter spesial adalah '$^.*+?[\'. ']' merupakan karakter spesial jika diakhiri dengan alternatif karakter (lihat di bawah). '-' merupakan karakter spesial di dalam alternatif karakter. Karakter lain apa pun yang muncul dalam regular expression adalah biasa, kecuali karakter '\' mendahuluinya. (Saat Anda menggunakan regular expression dalam program Lisp, setiap '\' harus digandakan, lihat contoh di akhir bagian ini.)
Sebagai contoh, 'f' bukan merupakan karakter spesial, hanya karakter biasa, sehingga 'f' adalah regular expression yang cocok dengan string 'f' dan tidak ada arti string lain. (sehingga tidak cocok dengan string 'ff'.) Demikian juga, 'o' adalah regular expression yang hanya cocok dengan 'o'. (Ketika perbedaan huruf besar dan kecil diabaikan, regexp ini juga cocok dengan 'F' dan 'O', tetapi kami menganggap ini sebagai generalisasi dari "string yang sama", bukan pengecualian.)
Setiap dua regular expression a dan b dapat digabungkan. Hasilnya adalah regular expressionyang cocok dengan sebuah string jika a cocok dengan sejumlah awal string itu dan b cocok dengan sisa string. Sebagai contoh sepele, menggabungkan ekspresi reguler 'f' dan 'o' menghasilkan ekspresi reguler 'fo', yang hanya cocok dengan string 'fo'. Untuk melakukan sesuatu yang tidak terlalu sepele, Anda perlu menggunakan salah satu karakter spesial. Berikut adalah daftarnya.
. (Period)/(Titik)
adalah karakter spesial yang cocok dengan karakter tunggal apa pun kecuali enter/linefeed/carriage return/baris baru. Misalnya, regular expression 'a.b' cocok dengan string tiga karakter apa pun yang dimulai dengan 'a' dan diakhiri dengan 'b'.
* (bintang)
karakter ini tidak bisa berdiri sendiri; merupakan operator postfix (akhiran) yang berarti mencocokkan regular expression sebelumnya berulang kali, dari tidak ada sampai sebanyak mungkin. Jadi, 'o*' cocok dengan sejumlah 'o', termasuk tidak ada 'o'.
'*' selalu berlaku untuk ekspresi sebelumnya yang sekecil mungkin. Jadi, 'fo*' memiliki pengulangan 'o', bukan pengulangan 'fo'. sehingga cocok dengan 'f', 'fo', 'foo', dan seterusnya.
Proses Pencocokan karakter '*' , secara langsung dengan pengulangan sebanyak yang dapat ditemukan. Kemudian dilanjutkan dengan sisa pola. Jika gagal, backtracking terjadi, membuang beberapa kecocokan dari karakter '*' yang dimodifikasi jika memungkinkan untuk mencocokkan pola lainnya. Misalnya, dalam mencocokkan 'ca*ar' dengan string 'caaar', 'a*' pertama kali mencoba mencocokkan ketiga 'a'; tetapi pola lainnya adalah 'ar' dan hanya ada 'r' yang tersisa untuk dicocokkan, jadi percobaan ini gagal. Alternatif berikutnya adalah untuk 'a*' untuk mencocokkan hanya dua 'a'. Dengan pilihan ini, regexp lainnya berhasil dicocokkan.
+ (tambah)
adalah operator postfix, mirip dengan '*' kecuali bahwa ekspresi ini harus cocok dengan ekspresi sebelumnya setidaknya sekali. Jadi, 'ca+r' cocok dengan string 'car' dan 'caaar' tetapi bukan string 'cr', sedangkan 'ca*r' cocok dengan ketiga string tersebut.
? (tanda tanya)
adalah operator postfix, mirip dengan '*' kecuali bahwa itu bisa cocok dengan ekspresi sebelumnya baik sekali atau tidak sama sekali. Jadi, 'ca?r' cocok dengan 'car' atau 'cr', dan tidak ada yang lain.
Jadi, baik 'ab*' dan 'ab*?' dapat cocok dengan string 'a' dan string 'abbbb'; tetapi jika Anda mencoba mencocokkan keduanya dengan teks 'abbb', 'ab*' akan mencocokkan semuanya (pencocokan valid terpanjang), sedangkan 'ab*?' akan mencocokkan hanya 'a' (pencocokan valid terpendek).
Operator non-greedy mencocokkan string sesingkat mungkin yang dimulai dari titik awal tertentu; dalam pencarian maju, bagaimanapun, titik awal paling awal untuk pertandingan selalu yang dipilih. Jadi, jika Anda mencari 'a.*?$' dengan teks 'abbab' diikuti dengan baris baru, itu cocok dengan seluruh string. Karena itu bisa cocok mulai dari 'a' pertama, itu cocok.
Catatan: untuk kompatibilitas historis, karakter spesial diperlakukan sebagai karakter biasa jika berada dalam konteks di mana makna khususnya tidak masuk akal. Misalnya, '*foo' memperlakukan '*' sebagai biasa karena tidak ada ekspresi sebelumnya di mana '*' dapat bertindak. Merupakan praktik yang buruk untuk bergantung pada perilaku ini; lebih baik mengutip karakter spesial, di mana pun karakter itu muncul.
Karena '\' tidak spesial di dalam alternatif karakter, itu tidak akan pernah bisa menghilangkan arti khusus dari '-' atau ']'. Jadi Anda tidak boleh mengutip karakter ini jika tidak memiliki arti khusus juga. Ini tidak akan mengklarifikasi apa pun, karena garis miring terbalik dapat secara sah mendahului karakter ini di mana mereka memiliki arti khusus, seperti dalam '[^\]' ("[^\\]" untuk sintaks string Lisp), yang cocok dengan karakter tunggal apa pun kecuali garis miring terbalik. \'.
Komentar
Posting Komentar