Bahasa Indonesia

Teks & alat sehari-hari · Perangkat Teks

Dari Kleene hingga JavaScript: sejarah singkat ekspresi reguler

· Latar belakang

ekspresi reguler javascript sejarah komputasi

Garis waktu yang menghubungkan finite automata, Unix grep, Perl dan JavaScript ekspresi reguler
Ilustrasi vektor ToolAcre asli

Menelusuri ekspresi reguler dari teori automata tahun 1950-an melalui ed, grep, dan Perl hingga ragam JavaScript di setiap browser, menjelaskan mengapa sintaksisnya terlihat seperti itu dan fitur mana yang muncul kapan.

Bahasa kecil yang aneh yang setengah diketahui semua orang — mengapa sintaksis regex terasa kuno dan tidak konsisten

Ekspresi reguler terasa seperti bahasa yang disusun lintas era karena pada dasarnya memang demikian. Inti kompak dari pergantian, pengulangan, dan pengelompokan berkembang dari notasi matematika menjadi perintah editor, filter baris perintah, dan fitur bahasa pemrograman. Tanda baca tetap ada sementara masing-masing host menambahkan kemudahan, batasan, dan terminologinya sendiri.

Riwayat tersebut menjelaskan mengapa suatu pola terlihat familier namun berperilaku berbeda antara grep, Perl, Python, dan JavaScript. “Regex” adalah nama keluarga, bukan tata bahasa universal. Bagi seorang analis otodidak, pelajaran yang berguna bukanlah menghafal setiap dialek, namun mengidentifikasi mesin, bendera, dan aturan penggantian sebelum memercayai pola pinjaman.

Peristiwa rutin Kleene - matematika automata terbatas tahun 1950-an yang memberi kita bintang

Karya Stephen Cole Kleene tentang finite automata dan “peristiwa biasa” memberikan akar teori pada tahun 1950an. Notasinya menggambarkan kumpulan jaringan simbol menggunakan operasi termasuk penyatuan, penggabungan, dan penutupan. Operasi penutupan menjadi bintang Kleene: `A*` berarti nol atau lebih pengulangan yang diambil dari A, bukan hanya “ulangi sekali atau lebih.”

Bahasa reguler formal yang dikenali oleh finite automata lebih sempit daripada banyak konstruksi yang sekarang dijual di bawah label regex. Referensi balik, misalnya, dapat mengungkapkan kondisi di luar model klasik tersebut. Oleh karena itu, mesin modern mempertahankan nama historis dan sebagian besar notasi sambil menerapkan bahasa pola yang kemampuan dan strategi eksekusinya melampaui objek matematika asli Kleene.

Thompson, ed dan grep - bagaimana regex memasuki pengeditan teks pada akhir tahun 1960an dan awal tahun 1970an pada alat Unix

Ken Thompson menghubungkan teori tersebut dengan alat teks yang berfungsi. Makalah 1968 Komunikasi ACM miliknya menjelaskan kompilasi ekspresi reguler ke dalam kode mesin untuk mencari teks, dan pekerjaan editor sebelumnya membantu menempatkan pencocokan pola di dalam garis keturunan Unix. Editor `ed` menggunakan ekspresi reguler dalam perintah yang memilih dan mengubah baris yang cocok.

Nama `grep` berasal dari perintah `ed` yang biasanya diterjemahkan sebagai `g/re/p`: memilih baris yang cocok dengan ekspresi reguler secara global dan mencetaknya. Grep awal bukanlah kumpulan opsi GNU saat ini, dan bentuk POSIX dasar dan lanjutan yang lebih baru berbeda. Perubahan yang bertahan lama ini bersifat praktis: bahasa simbolik kecil menjadi antarmuka sehari-hari untuk menemukan teks.

Perl dan PCRE — ekstensi yang menambahkan bilangan non-serakah, pencarian, dan sintaksis yang ditiru sebagian besar alat saat ini

Perl menjadikan bahasa pola yang lebih kaya sebagai pusat pemrograman tujuan umum. Di seluruh versinya, pemrogram menemukan kelompok tangkapan, referensi balik, pernyataan, pengukur malas, dan pengubah pola dalam satu ekosistem yang sangat terlihat. Dokumentasi Perl 5 mencatat konstruksi seperti `*?` untuk pencocokan minimal dan `(?=...)` untuk pandangan ke depan yang positif, di samping banyak fitur yang tidak ada pada formulir Unix lama.

Lebih aman mengatakan Perl mempopulerkan gaya ini daripada memujinya karena menciptakan setiap ekstensi. PCRE sengaja menawarkan sintaksis yang kompatibel dengan Perl, sementara mesin lain mengadopsi ide-ide tertentu dan menolak ide-ide lainnya. Tanda baca bersama dapat menyembunyikan semantik, perilaku, atau kinerja Unicode yang berbeda. Oleh karena itu, “seperti Perl” menggambarkan pengaruh yang luas, bukan jaminan bahwa pola Perl bersifat portabel.

Perl mempopulerkan bahasa pola praktis yang lebih besar; mesin selanjutnya dipinjam secara selektif

JavaScript menstandarkan objek `RegExp` dan sintaks literalnya sendiri, seperti `/pattern/gi`, untuk program yang berjalan di browser dan lingkungan ECMAScript lainnya. Citarasanya mencakup grup penangkap dan non-penangkap, referensi balik, pandangan ke depan, penghitungan malas, dan kelas karakter. Edisi selanjutnya menambahkan grup tangkapan bernama dan pernyataan lihat ke belakang dalam spesifikasi ES2018.

JavaScript bukan PCRE atau Python dengan pembatas berbeda. Ketersediaan fitur bergantung pada edisi ECMAScript yang diterapkan oleh mesin, dan tanda merupakan bagian dari perilaku, bukan hiasan. Panduan ekspresi reguler MDN adalah referensi praktis yang relevan untuk sintaksis browser, namun bahkan contoh JavaScript yang valid mungkin bergantung pada tanda yang tidak diekspos oleh antarmuka tertentu.

JavaScript memperoleh nama grup dan tertinggal di ES2018, namun mesin dan benderanya masih berbeda

Browser menempatkan mesin ekspresi reguler JavaScript di dekat pekerjaan teks biasa. Sebuah halaman dapat mengkompilasi pola, menghitung kecocokan dan meneruskannya ke `String.prototype.replace` tanpa mengirimkan teks ke layanan regex khusus. Ketersediaan tersebut memungkinkan antarmuka temukan dan ganti di sisi browser, meskipun halaman di sekitarnya masih harus diperiksa secara terpisah untuk klaim privasi yang lebih luas.

Implementasi ToolAcre memanggil `new RegExp` di dalam `compilePattern`, menangkap kegagalan kompilasi dan mengembalikan kesalahan alih-alih melempar. `findReplace` menghitung kecocokan sebelum menerapkan operasi penggantian standar. Akibatnya, JavaScript token pengganti seperti referensi penangkapan mengikuti string host API; sintaksis regex dan sintaks pengganti terkait tetapi bahasanya berbeda.

Apa yang tidak tercakup di sini - teori bahasa formal di luar dasar-dasar dan kinerja mesin internal

Sejarah singkat ini tidak membuktikan kesetaraan antara mesin praktis dan automata terbatas, algoritma eksekusi regex survei, atau implementasi peringkat berdasarkan kecepatan. Penelusuran mundur, teknik waktu linier, dan pola patologis memerlukan penanganan terpisah. Penjaga ToolAcre menangkap kesalahan sintaksis, namun tidak mendeteksi ekspresi valid yang melakukan penelusuran mundur berlebihan dan menghentikan thread browser utama.

Garis waktu juga tidak menugaskan setiap metakarakter ke satu penemu. Fitur perangkat lunak sering kali diperoleh melalui makalah, editor, rilis bahasa, dan implementasi ulang yang kompatibel, bukan hanya sekedar penyerahan saja. Sumber-sumber tersebut mendukung pencapaian tertentu; mereka tidak membenarkan cerita yang lebih sederhana bahwa satu produk menciptakan grosir regex modern atau bahwa rasa kemudian mewarisi perilaku yang sama.

Kesimpulannya — mode regex Text Toolkit adalah rasa JavaScript, sehingga pola dari dokumentasi browser berfungsi seperti yang tertulis

Warisan praktisnya terlihat di ToolAcre: aktifkan Regex dan teks pencarian dikompilasi oleh mesin JavaScript browser. Biarkan Regex tidak aktif dan metakarakter akan lolos, sehingga pencarian menjadi literal. Seluruh kata membungkus ekspresi dengan batas `` gaya ASCII, sedangkan sensitivitas huruf mengontrol apakah tanda `i` menyertai tanda `g` global yang selalu ada.

Detail terakhir tersebut mengoreksi janji garis besar bahwa pola dokumentasi browser berfungsi seperti yang tertulis. ToolAcre tidak mengekspos bendera multiline, dot-all, sticky atau Unicode, jadi contoh yang memerlukan `m`, `s`, `y`, `u` atau `v` memerlukan adaptasi dan beberapa tidak dapat direproduksi di sana. Gunakan alat ini untuk menguji pola JavaScript yang didukung, membaca jumlah penggantian, dan membatalkan sebelum menyempurnakan.