Bahasa Melayu

Teks & alat harian · Kit Alat Teks

Daripada Kleene hingga JavaScript: sejarah singkat ungkapan biasa

· Latar belakang

ungkapan biasa javascript sejarah pengkomputeran

Garis masa yang menghubungkan automata terhingga, Unix grep, Perl dan JavaScript ungkapan biasa
Ilustrasi vektor ToolAcre asal

Mengesan ungkapan biasa daripada teori automata 1950-an melalui ed, grep dan Perl kepada perisa JavaScript dalam setiap pelayar, menerangkan sebab sintaks kelihatan seperti itu dan ciri yang mana tiba.

Bahasa kecil pelik yang separuh tahu semua orang — mengapa sintaks regex terasa kuno dan tidak konsisten

Ungkapan biasa terasa seperti bahasa yang disusun merentasi era kerana itulah hakikatnya. Teras padat selang seli, pengulangan dan pengelompokan berkembang daripada tatatanda matematik kepada arahan editor, penapis baris arahan dan ciri bahasa pengaturcaraan. Tanda baca kekal manakala setiap hos menambah kemudahan, kekangan dan istilahnya sendiri.

Sejarah itu menerangkan sebab corak boleh kelihatan biasa tetapi berkelakuan berbeza antara grep, Perl, Python dan JavaScript. "Regex" ialah nama keluarga, bukan satu tatabahasa universal. Bagi penganalisis otodidak, pengajaran yang berguna bukanlah untuk menghafal setiap dialek, tetapi untuk mengenal pasti enjin, bendera dan peraturan penggantian sebelum mempercayai corak yang dipinjam.

Acara biasa Kleene — matematik 1950-an automata terhingga yang memberi kami bintang

Karya Stephen Cole Kleene mengenai automata terhingga dan "acara biasa" membekalkan akar teori semasa tahun 1950-an. Notasinya menerangkan set jujukan simbol menggunakan operasi termasuk kesatuan, penggabungan dan penutupan. Operasi penutupan menjadi bintang Kleene: `A*` bermaksud sifar atau lebih ulangan yang diambil dari A, bukan sekadar "ulang sekali atau lebih".

Bahasa biasa formal yang diiktiraf oleh automata terhingga adalah lebih sempit daripada banyak binaan yang kini dijual di bawah label regex. Rujukan belakang, sebagai contoh, boleh menyatakan keadaan di luar model klasik itu. Oleh itu, enjin moden mengekalkan nama sejarah dan kebanyakan notasi sambil melaksanakan bahasa corak yang keupayaan dan strategi pelaksanaannya melangkaui objek matematik asal Kleene.

Thompson, ed dan grep — cara regex memasukkan penyuntingan teks pada akhir 1960-an dan awal 1970-an alat Unix

Ken Thompson menghubungkan teori dengan alat teks yang berfungsi. Kertas 1968 Communications daripada tersebut ACM beliau menerangkan penyusunan ungkapan biasa ke dalam kod mesin untuk mencari teks, dan kerja editornya yang terdahulu membantu meletakkan padanan corak di dalam keturunan Unix. Editor `ed` menggunakan ungkapan biasa dalam arahan yang memilih dan mengubah baris yang sepadan.

Nama `grep` berasal daripada perintah `ed` yang biasa diberikan sebagai `g/re/p`: secara global pilih baris yang sepadan dengan ungkapan biasa dan cetaknya. Grep awal bukan koleksi pilihan GNU hari ini, dan borang POSIX asas dan lanjutan kemudian berbeza. Perubahan yang berkekalan adalah praktikal: bahasa simbolik yang kecil menjadi antara muka harian untuk mencari teks.

Perl dan PCRE — sambungan yang menambahkan pengkuantiti tidak tamak, lihat sekeliling dan sintaks kebanyakan alat yang disalin hari ini

Perl menjadikan bahasa corak yang lebih kaya sebagai pusat pengaturcaraan tujuan umum. Di seluruh versinya, pengaturcara menemui kumpulan tangkapan, rujukan belakang, penegasan, pengkuantiti malas dan pengubah suai corak dalam satu ekosistem yang sangat kelihatan. Perl 5 binaan rekod dokumentasi seperti `*?` untuk padanan minimum dan `(?=...)` untuk pandangan positif, di samping banyak ciri yang tidak terdapat dalam borang Unix yang lebih lama.

Adalah lebih selamat untuk mengatakan Perl mempopularkan gaya ini daripada mengkreditkannya dengan mencipta setiap sambungan. PCRE sengaja menawarkan sintaks serasi Perl, manakala enjin lain menggunakan idea terpilih dan menolak idea lain. Tanda baca yang dikongsi boleh menyembunyikan semantik, tingkah laku atau prestasi Unikod yang berbeza. "Seperti Perl" akibatnya menerangkan pengaruh yang luas, bukan jaminan bahawa corak Perl mudah alih.

Perl mempopularkan bahasa corak praktikal yang lebih besar; enjin kemudiannya dipinjam secara terpilih

JavaScript menyeragamkan objek `RegExp` dan sintaks literalnya sendiri, seperti `/pattern/gi`, untuk program yang dijalankan dalam pelayar dan persekitaran ECMAScript yang lain. Rasanya termasuk kumpulan tangkap dan bukan tangkap, rujukan belakang, pandangan ke hadapan, pengkuantiti malas dan kelas watak. Edisi kemudian menambahkan kumpulan tangkapan bernama dan lihat di sebalik penegasan dalam spesifikasi ES2018.

JavaScript bukan PCRE atau Python dengan pembatas yang berbeza. Ketersediaan ciri bergantung pada edisi ECMAScript yang dilaksanakan oleh enjin, dan bendera adalah sebahagian daripada tingkah laku dan bukannya hiasan. Panduan ungkapan biasa MDN ialah rujukan praktikal yang berkaitan untuk sintaks pelayar, tetapi contoh JavaScript yang sah mungkin bergantung pada bendera yang tidak didedahkan oleh antara muka tertentu.

JavaScript memperoleh kumpulan bernama dan melihat di belakang dalam ES2018, tetapi enjin dan bendera masih berbeza

Pelayar meletakkan JavaScript enjin ungkapan biasa berhampiran kerja teks biasa. Halaman boleh menyusun corak, mengira padanan dan menghantarnya kepada `String.prototype.replace` tanpa menghantar teks kepada perkhidmatan regex khusus. Ketersediaan itu membolehkan antara muka cari dan ganti sebelah pelayar, walaupun halaman sekeliling masih mesti diperiksa secara berasingan untuk tuntutan privasi yang lebih luas.

Pelaksanaan ToolAcre memanggil `new RegExp` di dalam `compilePattern`, menangkap kegagalan kompilasi dan mengembalikan ralat dan bukannya membuang. `findReplace` mengira perlawanan sebelum menggunakan operasi gantian standard. Akibatnya, JavaScript token gantian seperti rujukan tangkapan mengikut rentetan hos API; sintaks regex dan sintaks penggantian adalah bahasa yang berkaitan tetapi berbeza.

Perkara ini tidak meliputi — teori bahasa formal di luar asas dan dalaman prestasi enjin

Sejarah pendek ini tidak membuktikan kesetaraan antara enjin praktikal dan automata terhingga, algoritma pelaksanaan regex tinjauan atau pelaksanaan peringkat mengikut kelajuan. Penjejakan ke belakang, teknik masa linear dan corak patologi layak mendapat rawatan yang berasingan. Pengawal ToolAcre menangkap ralat sintaks, tetapi ia tidak mengesan ungkapan yang sah yang melakukan pengesanan belakang yang berlebihan dan menghalang urutan pelayar utama.

Garis masa juga tidak memperuntukkan setiap aksara meta kepada satu pencipta. Ciri perisian selalunya tiba melalui kertas kerja, editor, keluaran bahasa dan pelaksanaan semula yang serasi dan bukannya satu penyerahan bersih. Sumber menyokong pencapaian tertentu; mereka tidak membenarkan cerita yang lebih mudah bahawa satu produk mencipta borong regex moden atau rasa kemudiannya mewarisi tingkah laku yang sama.

Bawa pulang — mod regex Text Toolkit ialah perisa JavaScript, jadi corak daripada dokumentasi pelayar berfungsi seperti yang ditulis

Warisan praktikal boleh dilihat dalam ToolAcre: hidupkan Regex dan teks carian disusun oleh pelayar JavaScript enjin. Biarkan Regex dimatikan dan metakarakter terlepas, menjadikan carian itu literal. Seluruh perkataan membungkus ungkapan dengan ASCII-gaya `` sempadan, manakala sensitiviti kes mengawal sama ada `i` bendera mengiringi global yang sentiasa ada `g` bendera.

Butiran terakhir itu membetulkan janji luas garis besar bahawa corak dokumentasi pelayar berfungsi seperti yang ditulis. ToolAcre tidak mendedahkan bendera berbilang baris, titik-semua, melekit atau Unicode, jadi contoh memerlukan `m`, `s`, `y`, `u` atau `v` memerlukan penyesuaian dan ada yang tidak boleh diterbitkan semula di sana. Gunakan alat untuk menguji disokong JavaScript corak, baca kiraan gantian dan buat asal sebelum menapis.