Teks & alat sehari-hari · Perangkat Teks
Mengapa ^ dan $ hanya cocok sekali: tanda regex di browser temukan dan ganti
· Cara kerjanya
ekspresi reguler temukan-dan-ganti pembersihan teks
Menjelaskan tanda regex JavaScript — global, multiline, dan dotAll — dan mengapa kotak cari-dan-ganti dikompilasi tanpa jangkar multiline ^ dan $ ke seluruh teks, dengan pola yang berfungsi.
Pola yang hanya memperbaiki baris pertama — apa yang terjadi jika Anda mengharapkan ^ berarti 'awal setiap baris'
Daftar yang ditempel mungkin berisi awalan yang tidak diinginkan di setiap baris, namun pencarian `^prefix` akan menghapusnya hanya dari baris pertama. Hasil yang mengejutkan datang dari konfigurasi polanya, bukan dari data yang tidak konsisten. Dalam ToolAcre, `^` mengidentifikasi awal teks lengkap karena ekspresi reguler dikompilasi tanpa mode multiline.
Jangkar `$` yang cocok mengikuti aturan yang sama di tepi lainnya: jangkar mengidentifikasi akhir teks lengkap, bukan setiap baris yang berakhir di dalamnya. Pemutusan garis tetap menjadi bagian dari masukan, namun tidak menjadi posisi jangkar lainnya. Periksa jumlah penggantian yang dilaporkan sebelum mengimpor daftar yang dibersihkan; hitungan satu akan segera memperlihatkan ketidakcocokan.
Bendera g — mengapa 'mengganti setiap pertandingan dalam satu lintasan' bergantung pada bendera global yang disetel
ToolAcre selalu membuat pola pencariannya dengan tanda `g` global. Pilihan tersebut memerintahkan JavaScript untuk mengumpulkan setiap pertandingan yang tidak tumpang tindih daripada berhenti setelah pertandingan pertama. Alat ini pertama-tama memanggil `match` untuk menentukan hitungan, lalu meneruskan pola global yang sama ke `replace`, sehingga nomor yang ditampilkan dan kartu pengganti menggunakan satu aturan yang cocok.
Pencocokan global tidak dapat menciptakan posisi yang tidak dikenali oleh pola tersebut. Dengan `^prefix`, hanya ada satu permulaan teks utuh yang memenuhi syarat, jadi `g` masih menemukan satu kecocokan. Dengan pola yang dapat muncul pada beberapa baris, `g` memungkinkan semua kemunculan diganti. Pisahkan pertanyaan-pertanyaan ini saat melakukan debug: jangkar memutuskan di mana kecocokan dapat dimulai, sementara mode global memutuskan apakah pencarian dilanjutkan.
Bendera m — bagaimana multiline berubah ^ dan $ dari jangkar teks utuh menjadi jangkar baris, dan mengapa alat ini tidak menyertakannya
Bendera multibaris `m` mengubah cara `^` dan `$` diinterpretasikan, memungkinkan keduanya mengenali posisi di sekitar terminator garis serta batas luar teks. ToolAcre tidak menambahkan tanda itu. Kompilernya menggunakan `g` untuk pencarian peka huruf besar-kecil dan `gi` ketika sensitivitas huruf besar/kecil dihapus, tanpa kontrol pengguna untuk tanda tambahan.
Membiarkan multiline tidak tersedia akan membuat antarmuka tetap kecil, namun itu berarti pola yang disalin dari editor yang dikonfigurasi dengan `gm` mungkin berperilaku berbeda di sini. Jangan berasumsi bahwa ekspresi yang familiar membawa tandanya. JavaScript huruf tanda diberikan saat RegExp dibuat, dan alat ini menolak sintaks tanda sebaris yang tidak didukung daripada mengaktifkan mode lain secara diam-diam.
Bendera s — mengapa sebuah titik tidak cocok dengan baris baru secara default, dan bagaimana mencocokkan seluruh baris tanpa itu
Sebuah titik pada alat ini tidak cocok dengan jeda baris karena kompiler juga menghilangkan tanda dotAll `s`. Pola seperti `BEGIN.*END` dapat cocok bila kedua penanda berada pada satu baris, namun berhenti pada jeda baris pertama bila penanda merentang beberapa baris. Menambahkan mode global tidak mengubah apa yang dapat dikonsumsi oleh titik itu sendiri.
Jika pencocokan garis silang benar-benar diperlukan, tuliskan karakter yang diizinkan secara eksplisit. Kelas seperti `[\s\S]*?` dapat menjangkau spasi putih dan non-spasi namun tetap enggan, meskipun pola yang luas layak untuk diuji pada sampel kecil terlebih dahulu. Kompiler menangkap sintaks yang tidak valid, namun tidak melindungi tab dari ekspresi mahal dengan perilaku backtracking yang parah.
Mencocokkan baris baru secara eksplisit — menggunakan \n dalam pola untuk menargetkan awal dan akhir baris ketika multibaris tidak tersedia
Untuk permulaan baris berulang tanpa mode multibaris, cocokkan awal teks atau baris baru: `(^|\n)prefix`. Alternatif pertama menangani baris pertama, dan alternatif kedua menangani baris selanjutnya dengan menggunakan baris baru sebelumnya. Tanda kurung menunjukkan batas mana pun yang cocok, sehingga memberikan pengganti cara untuk mempertahankan struktur yang memisahkan garis.
Teknik ini mengasumsikan pemisah garis-umpan dalam polanya. Pustaka teks mengenali CRLF, LF, dan CR tunggal saat melakukan operasi jalur khusus, tetapi temukan dan ganti pencarian string asli secara langsung. Jika konten yang ditempel menggunakan bentuk akhir baris yang lain, normalkan terlebih dahulu atau sesuaikan ekspresinya dengan sengaja; jika tidak, baris selanjutnya mungkin tetap tidak tersentuh meskipun terlihat sama di layar.
Cocokkan batas garis secara eksplisit dengan (^|\n) dan pertahankan pemisah yang ditangkap
Misalkan inputnya adalah `ID: apple`, `ID: pear`, dan `ID: plum` pada baris terpisah. Aktifkan Regex, cari `(^|\n)ID: `, dan ganti dengan `$1`. Pada baris pertama, `$1` adalah posisi awal yang kosong; di baris selanjutnya, itu adalah baris baru yang diambil. Labelnya hilang sementara ketiga batas baris tetap di tempatnya.
Baca hitungan penggantian sebelum menerima hasilnya. Tiga baris harus menghasilkan tiga penggantian dalam contoh ini. Jika hitungannya satu, periksa pola sebenarnya dan ujung garis daripada mengulangi operasi tersebut. Pembatalan tersedia setelah penggantian, sehingga uji coba kecil dapat mengonfirmasi pencocokan dan rekonstruksi sebelum ekspresi yang sama menyentuh daftar impor yang lebih panjang.
Apa yang tidak tercakup dalam hal ini - tanda u, i dan y, dan memasukkan baris baru ke dalam penggantinya, yang tidak dapat dilakukan oleh bidang satu baris
Implementasinya juga menggunakan `i` ketika sensitivitas huruf besar/kecil dinonaktifkan, namun tidak memperlihatkan kontrol untuk `u`, `y`, `m`, atau `s`. Artikel ini tidak menetapkan perilaku pada mode yang tidak tersedia tersebut selain menjelaskan efek multiline dan dotAll yang hilang yang diperlukan sebagai contoh. Pola dari lingkungan JavaScript lain harus ditinjau berdasarkan flag yang sebenarnya dikompilasi oleh ToolAcre.
Sumber tersebut membuktikan bahwa teks pengganti diteruskan ke JavaScript `String.replace`, sehingga substitusi seperti `$1`, `$&`, dan `$$` tetap memiliki arti JavaScript. Itu tidak menetapkan setiap interaksi yang ditawarkan oleh bidang yang dirender dari file yang digunakan di sini. Secara khusus, menyisipkan baris baru secara fisik melalui antarmuka harus diuji, bukan hanya disimpulkan dari garis besarnya saja.
Tanda dan perilaku bidang pengganti lainnya berada di luar penerapan alat ini
Perlakukan bendera sebagai bagian dari ekspresi reguler, bahkan ketika antarmuka hanya menampilkan isi pola. Di ToolAcre, setiap penelusuran bersifat global, mode opsional peka huruf besar/kecil menambahkan `i`, dan multiline serta dotAll tidak ada. Fakta tersebut menjelaskan mengapa penggantian berlanjut pada kecocokan biasa sementara `^`, `$`, dan titik mempertahankan batasan seluruh teks dan baris tunggal defaultnya.
Untuk daftar yang ditempel dengan awalan, `(^|\n)prefix` dengan `$1` adalah solusi praktis karena memberi nama batas dan mempertahankannya. Mulailah dengan baris yang representatif, konfirmasikan penghitungan, periksa struktur garis yang dihasilkan, dan baru kemudian proses kumpulan data lengkap. Prosedur tersebut mengubah hasil satu pertandingan yang membingungkan menjadi langkah pembersihan yang dapat ditinjau sebelum diimpor.