Bahasa Melayu

Teks & alat harian · Kit Alat Teks

Mengapa ^ dan $ sepadan sekali sahaja: bendera regex dalam pelayar cari dan ganti

· Bagaimana ia berfungsi

ungkapan biasa cari-dan-ganti pembersihan teks

Senarai berbilang baris menunjukkan satu sauh teks keseluruhan dan sempadan baris baharu eksplisit yang berulang
Ilustrasi vektor ToolAcre asal

Menerangkan bendera regex JavaScript — global, multiline dan dotAll — dan sebab kotak cari-dan-ganti disusun tanpa sauh berbilang baris ^ dan $ pada keseluruhan teks, dengan corak yang berfungsi sebaliknya.

Corak yang sahaja menetapkan baris pertama — apa yang berlaku apabila anda menjangkakan ^ bermaksud 'permulaan setiap baris'

Senarai yang ditampal mungkin mengandungi awalan yang tidak diingini yang sama pada setiap baris, namun mencari `^prefix` sahaja mengalih keluarnya daripada baris pertama. Hasil yang mengejutkan datang daripada konfigurasi corak, bukan daripada data yang tidak konsisten. Dalam ToolAcre, `^` mengenal pasti permulaan teks lengkap kerana ungkapan biasa disusun tanpa mod berbilang baris.

Penambat `$` yang sepadan mengikut peraturan yang sama di tepi yang lain: ia mengenal pasti penghujung teks lengkap, bukan setiap baris yang berakhir di dalamnya. Pemisah baris kekal sebagai sebahagian daripada input, tetapi ia tidak menjadi satu lagi kedudukan sauh. Semak kiraan penggantian yang dilaporkan sebelum mengimport senarai yang telah dibersihkan; kiraan satu mendedahkan ketidakpadanan serta-merta.

Bendera g — mengapa 'menggantikan setiap perlawanan dalam satu hantaran' bergantung pada bendera global yang ditetapkan

ToolAcre sentiasa membina corak cariannya dengan bendera `g` global. Pilihan itu memberitahu JavaScript untuk mengumpulkan setiap perlawanan yang tidak bertindih daripada berhenti selepas perlawanan pertama. Alat ini mula-mula memanggil `match` untuk menentukan kiraan, kemudian menghantar corak global yang sama kepada `replace`, jadi nombor yang dipaparkan dan pas gantian menggunakan satu peraturan padanan.

Padanan global tidak boleh mencipta kedudukan yang tidak dikenali oleh corak. Dengan `^prefix`, sahaja terdapat satu permulaan teks yang layak, jadi `g` masih mencari satu padanan. Dengan corak yang boleh berlaku pada beberapa baris, `g` membenarkan semua kejadian diganti. Asingkan soalan ini semasa menyahpepijat: sauh menentukan tempat perlawanan boleh bermula, manakala mod global menentukan sama ada carian diteruskan.

Bendera m — cara berbilang baris berubah ^ dan $ daripada sauh teks keseluruhan kepada sauh baris, dan sebab alat ini meninggalkannya

Bendera `m` berbilang baris mengubah cara `^` dan `$` ditafsirkan, membolehkan mereka mengecam kedudukan di sekeliling penamat baris serta sempadan teks luar. ToolAcre tidak menambah bendera itu. Pengkompilnya menggunakan `g` untuk carian sensitif huruf besar dan `gi` apabila sensitiviti huruf besar dikosongkan, tanpa kawalan pengguna untuk bendera tambahan.

Membiarkan berbilang talian tidak tersedia menjadikan antara muka kecil, tetapi ini bermakna corak yang disalin daripada editor yang dikonfigurasikan dengan `gm` mungkin berkelakuan berbeza di sini. Jangan menganggap bahawa ungkapan biasa membawa bendera bersamanya. JavaScript huruf bendera dibekalkan apabila RegExp dibuat dan alat ini menolak sintaks bendera sebaris yang tidak disokong dan bukannya mendayakan mod lain secara senyap.

Bendera s — mengapa titik tidak sepadan dengan baris baharu secara lalai dan cara memadankan merentas baris tanpanya

Titik dalam alat ini tidak sepadan dengan pemisah baris kerana pengkompil juga menghilangkan bendera dotAll `s`. Corak seperti `BEGIN.*END` boleh dipadankan apabila kedua-dua penanda berada pada satu baris, tetapi ia berhenti pada pemisah baris pertama apabila penanda menjangkau beberapa baris. Menambah mod global tidak mengubah perkara yang boleh digunakan oleh titik itu sendiri.

Apabila padanan garis silang benar-benar diperlukan, tulis aksara yang dibenarkan secara eksplisit. Kelas seperti `[\s\S]*?` boleh menjangkau ruang kosong dan bukan ruang kosong sambil kekal enggan, walaupun corak yang luas patut diuji pada sampel kecil terlebih dahulu. Pengkompil menangkap sintaks yang tidak sah, tetapi ia tidak melindungi tab daripada ungkapan mahal dengan tingkah laku menjejak ke belakang yang teruk.

Memadankan baris baharu secara eksplisit — menggunakan \n dalam corak untuk menyasarkan baris bermula dan tamat apabila berbilang baris tidak tersedia

Untuk baris berulang bermula tanpa mod berbilang baris, padankan sama ada permulaan teks atau baris baharu: `(^|\n)prefix`. Alternatif pertama mengendalikan baris pertama, dan yang kedua mengendalikan baris kemudian dengan menggunakan baris baharu sebelumnya. Tanda kurung menangkap mana-mana sempadan yang dipadankan, memberikan penggantian cara untuk mengekalkan struktur yang memisahkan garisan.

Teknik ini menganggap pemisah suapan baris dalam corak. Pustaka teks mengenali CRLF, LF dan CR tunggal apabila melakukan operasi baris khusus, tetapi cari dan gantikan carian rentetan asal secara terus. Jika kandungan yang ditampal menggunakan bentuk pengakhiran baris yang lain, normalkan ia dahulu atau sesuaikan ungkapan dengan sengaja; jika tidak, baris kemudian mungkin kekal tidak disentuh walaupun ia kelihatan sama pada skrin.

Padankan sempadan garisan secara eksplisit dengan (^|\n) dan kekalkan pemisah yang ditangkap

Katakan input ialah `ID: apple`, `ID: pear` dan `ID: plum` pada baris berasingan. Dayakan Regex, cari `(^|\n)ID: ` dan gantikan dengan `$1`. Pada baris pertama, `$1` ialah kedudukan mula yang kosong; pada baris kemudian, ia ialah baris baharu yang ditangkap. Label hilang sementara ketiga-tiga sempadan baris kekal di tempatnya.

Baca kiraan penggantian sebelum menerima keputusan. Tiga baris harus menghasilkan tiga penggantian dalam contoh ini. Jika kiraan adalah satu, periksa corak dan penghujung garisan sebenar daripada mengulangi operasi. Buat asal tersedia selepas penggantian, jadi percubaan kecil boleh mengesahkan padanan dan pembinaan semula sebelum ungkapan yang sama menyentuh senarai import yang lebih panjang.

Perkara ini tidak meliputi — bendera u, i dan y, dan memasukkan baris baharu ke dalam penggantian, yang tidak boleh dilakukan oleh medan satu baris

Pelaksanaan juga menggunakan `i` apabila sensitiviti huruf besar dimatikan, tetapi ia tidak mendedahkan kawalan untuk `u`, `y`, `m` atau `s`. Artikel ini tidak memperuntukkan gelagat kepada mod yang tidak tersedia itu selain daripada menerangkan kesan berbilang baris dan dotAll yang hilang yang diperlukan untuk contoh. Corak daripada persekitaran JavaScript yang lain mesti disemak terhadap bendera yang sebenarnya disusun oleh ToolAcre.

Sumber tersebut membuktikan bahawa teks gantian dihantar kepada JavaScript `String.replace`, jadi penggantian seperti `$1`, `$&` dan `$$` mengekalkan makna JavaScript mereka. Ia tidak menetapkan setiap interaksi yang ditawarkan oleh medan yang diberikan daripada fail yang digunakan di sini. Khususnya, memasukkan baris baharu fizikal melalui antara muka harus diuji dan bukannya disimpulkan daripada garis besar sahaja.

Bendera lain dan gelagat medan gantian berada di luar pelaksanaan alat ini

Anggap bendera sebagai sebahagian daripada ungkapan biasa, walaupun apabila antara muka sahaja memaparkan badan corak. Dalam ToolAcre, setiap carian adalah global, mod tidak sensitif huruf pilihan menambah `i` dan multiline serta dotAll tiada. Fakta tersebut menerangkan sebab penggantian diteruskan merentas padanan biasa manakala `^`, `$` dan titik mengekalkan kekangan teks keseluruhan dan satu baris lalai.

Untuk senarai tampal awalan, `(^|\n)prefix` dengan `$1` ialah penyelesaian praktikal kerana ia menamakan sempadan dan mengekalkannya. Mulakan dengan baris perwakilan, sahkan kiraan, periksa struktur baris yang terhasil, dan sahaja kemudian proses set data penuh. Prosedur itu menukar keputusan satu perlawanan yang membingungkan menjadi langkah pembersihan yang boleh disemak sebelum diimport.