Apabila membina ungkapan biasa menggunakan pembina RegExp, adalah penting untuk double-escape rentetan literal untuk memastikan ia ditafsirkan dengan betul. Keperluan ini berpunca daripada fakta bahawa penghurai rentetan JavaScript menggunakan garis miring ke belakang awal, menyebabkan enjin ungkapan biasa tidak mengetahui tujuan yang dimaksudkan.
Untuk menggambarkan ini, pertimbangkan contoh berikut:
const res = new RegExp('(\s|^)' + foo).test(moo);
Dalam keadaan ini, rentetan literal '(\s|^)' foo diserahkan kepada pembina RegExp untuk mencipta ungkapan biasa. Walau bagaimanapun, garis miring ke belakang awal digunakan oleh penghurai rentetan, meninggalkan 's|^)' foo untuk enjin ungkapan biasa. Input yang tidak dijangka ini boleh menyebabkan salah tafsir.
Contoh konkrit salah tafsir sedemikian berlaku apabila menggunakan satu pelarian untuk watak istimewa, seperti .:
const string = '.*'; console.log(string);
Dalam kes ini, niat adalah untuk memadankan mana-mana watak menggunakan . kad bebas. Walau bagaimanapun, sejak digunakan oleh penghurai rentetan, . tidak lagi dianggap sebagai kad bebas tetapi sebagai titik literal. Ini membawa kepada ungkapan biasa yang salah yang hanya sepadan dengan aksara titik.
Untuk mengelakkan salah tafsir ini, rentetan melarikan diri dua kali yang diberikan kepada pembina RegExp adalah penting. Dengan meletakkan garis miring ke belakang tambahan sebelum setiap aksara khas, anda memastikan bahawa enjin ungkapan biasa menghuraikan urutan melarikan diri yang dimaksudkan dengan betul.
Dalam contoh di bawah, melarikan diri berganda digunakan:
const string = '(\s|^)' + foo; console.log(string);
Ini membina ungkapan biasa dengan betul dengan mengekalkan urutan pelarian yang dimaksudkan, memastikan gelagat pemadanan yang tepat. Ingat, apabila menggunakan pembina RegExp dengan literal rentetan, sentiasa melarikan diri dua kali untuk mengelakkan tafsiran aksara khas yang tidak dijangka.
Atas ialah kandungan terperinci Mengapa Saya Perlu Melarikan Diri Berganda Apabila Menggunakan Pembina RegExp JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!