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'.

Contoh reguler expression  a.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.

Contoh reguler expression  fo*

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.


Contoh reguler expression  ca*ar

+ (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.

Contoh reguler expression  ca+r

? (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.

Contoh reguler expression  ca?ar

*?, +?, ??
adalah varian non-greedy (cocok dengan karakter sesedikit mungkin—sehingga masih bisa cocok dengan pola dalam string yang diberikan) dari operator di atas. Operator normal '*', '+', '?' cocok sebanyak yang mereka bisa, selama keseluruhan regexp masih bisa cocok. Dengan mengikuti '?', mereka akan cocok sesedikit mungkin.

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.

Contoh reguler expression  a.*?$ (non-greedy)


\{n\}
adalah operator postfix yang menetapkan n pengulangan—yaitu, regexp sebelumnya harus sama persis n kali berturut-turut. Misalnya, 'x\{4\}' cocok dengan string 'xxxx' dan tidak ada yang lain.

\{n,m\}
adalah operator postfix yang menentukan antara pengulangan n dan m—yaitu, regexp  sebelumnya harus cocok setidaknya n kali, tetapi tidak lebih dari m kali. Jika m dihilangkan, maka tidak ada batas atas, tetapi regexp sebelumnya harus cocok minimal n kali.
'\{0,1\}' setara dengan '?'.
'\{0,\}' setara dengan '*'.
'\{1,\}' setara dengan '+'.

[ … ] 
adalah kumpulan karakter, dimulai dengan '[' dan diakhiri dengan ']'.

Contoh paling sederhana, karakter di antara dua tanda kurung adalah yang dapat dicocokkan oleh kedua karakter  ini. Jadi, '[ad]' cocok dengan salah satu 'a' atau satu 'd', dan '[ad]*' cocok dengan string apa pun yang terdiri dari hanya 'a' dan 'd' (termasuk string kosong). Oleh karena itu 'c[ad]*r' cocok dengan 'cr', 'car', 'cdr', 'caddaar', dll.

Anda juga dapat menyertakan rentang karakter dalam kumpulan karakter, dengan menulis karakter awal dan akhir dengan '-' di antaranya. Jadi, '[a-z]' cocok dengan huruf ASCII huruf kecil apa pun. Rentang dapat dicampur secara bebas dengan karakter individu, seperti dalam '[a-z$%.]', yang cocok dengan huruf ASCII huruf kecil atau '$', '%' atau titik. Sebagai contoh lain, '[α-ωί]' cocok dengan semua huruf Yunani huruf kecil.

Anda juga dapat menyertakan kelas karakter spesial tertentu dalam rangkaian karakter. A '[:' dan menyeimbangkan ':]' menyertakan kelas karakter di dalam alternatif karakter. Misalnya, '[[:alnum:]]' cocok dengan huruf atau angka apa pun. Lihat Kelas Char di Manual Referensi Emacs Lisp, untuk daftar kelas karakter.

Untuk menyertakan ']' dalam kumpulan karakter, Anda harus menjadikannya karakter pertama. Misalnya, '[]a]' cocok dengan ']' atau 'a'. Untuk menyertakan '-', tulis '-' sebagai karakter terakhir dari himpunan, Anda juga dapat meletakkannya terlebih dahulu atau setelah rentang. Jadi, '[]-]' cocok dengan ']' dan '-'.

Untuk memasukkan '^' dalam satu set, letakkan di mana saja kecuali di awal set. (Pada awalnya, ini melengkapi set—lihat di bawah.)

Saat Anda menggunakan rentang dalam pencarian yang tidak peka huruf besar/kecil, Anda harus menulis kedua ujung rentang dalam huruf besar, atau keduanya dalam huruf kecil, atau keduanya harus bukan huruf. Perilaku rentang kasus campuran seperti 'A-z' agak tidak jelas, dan mungkin berubah di versi Emacs mendatang.

[ ^ … ] 
'[^' memulai kumpulan karakter komplemen, yang cocok dengan karakter apa pun kecuali yang ditentukan. Jadi, '[^a-z0-9A-Z]' cocok dengan semua karakter kecuali huruf dan angka ASCII.

'^' tidak spesial dalam kumpulan karakter kecuali itu adalah karakter pertama. Karakter setelah '^' diperlakukan seolah-olah itu yang pertama (dengan kata lain, '-' dan ']' tidak istimewa di sana).

Kumpulan karakter yang dilengkapi dapat cocok dengan baris baru, kecuali jika baris baru disebutkan sebagai salah satu karakter yang tidak cocok. Ini berbeda dengan penanganan regexps dalam program seperti grep.

^
adalah karakter spesial yang cocok dengan string kosong, tetapi hanya di awal baris teks yang cocok. Kalau tidak, itu gagal untuk mencocokkan apa pun. Jadi, '^foo' cocok dengan 'foo' yang muncul di awal baris.

Untuk alasan kompatibilitas historis, '^' dapat digunakan dengan arti ini hanya di awal ekspresi reguler, atau setelah '\(' atau '\|'.


$
 mirip dengan '^' tetapi hanya cocok di akhir baris. Jadi, 'x+$' cocok dengan string satu 'x' atau lebih di akhir baris.

Untuk alasan kompatibilitas historis, '$' dapat digunakan dengan arti ini hanya di akhir ekspresi reguler, atau sebelum '\)' atau '\|'.


\
memiliki dua fungsi: mengutip karakter spesial (termasuk '\'), dan memperkenalkan konstruksi spesial tambahan.

Karena '\' mengutip karakter spesial, '\$' adalah ekspresi reguler yang hanya cocok dengan '$', dan '\[' adalah ekspresi reguler yang hanya cocok dengan '[', dan seterusnya.

Lihat bagian berikut untuk konstruksi spesial yang dimulai dengan '\'.


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

Postingan populer dari blog ini

Mengubah Banyak Nama File dengan Nama BIlangan Berurutan secara Cepat (dan mudah) dengan Emacs (Bag 1)

Mengubah Banyak Nama File secara Cepat dengan Emacs