Sebagian besar ekspresi di sini menyelesaikan kasus penggunaan tunggal spesifik.
Tidak apa-apa, tapi saya lebih suka pendekatan "selalu berhasil".
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Ini akan "sepenuhnya keluar" dari string literal untuk penggunaan berikut dalam ekspresi reguler:
- Penyisipan dalam ekspresi reguler. Misalnya
new RegExp(regExpEscape(str))
- Penyisipan dalam kelas karakter. Misalnya
new RegExp('[' + regExpEscape(str) + ']')
- Penyisipan dalam specifier jumlah integer. Misalnya
new RegExp('x{1,' + regExpEscape(str) + '}')
- Eksekusi di mesin ekspresi reguler non-JavaScript.
Karakter Khusus yang Dicakup:
-
: Membuat rentang karakter dalam kelas karakter.
[
/ ]
: Memulai / mengakhiri kelas karakter.
{
/ }
: Memulai / mengakhiri specifier angka.
(
/ )
: Memulai / mengakhiri grup.
*
/ +
/ ?
: Menentukan jenis pengulangan.
.
: Cocok dengan karakter apa pun.
\
: Melepaskan karakter, dan memulai entitas.
^
: Menentukan mulai dari zona pencocokan, dan meniadakan pencocokan di kelas karakter.
$
: Menentukan akhir zona pencocokan.
|
: Menentukan pergantian.
#
: Menentukan komentar dalam mode jarak bebas.
\s
: Diabaikan dalam mode jarak bebas.
,
: Memisahkan nilai dalam penentu angka.
/
: Memulai atau mengakhiri ekspresi.
:
: Menyelesaikan tipe grup khusus, dan bagian dari kelas karakter Perl-style.
!
: Meniadakan grup dengan lebar nol.
<
/ =
: Bagian dari spesifikasi grup nol-lebar.
Catatan:
/
tidak sepenuhnya diperlukan dalam rasa ekspresi reguler. Namun, itu melindungi jika seseorang (gemetaran) tidak eval("/" + pattern + "/");
.
,
memastikan bahwa jika string dimaksudkan sebagai bilangan bulat dalam penentu angka, itu akan menyebabkan kesalahan kompilasi RegExp alih-alih diam-diam mengkompilasi yang salah.
#
, dan \s
tidak perlu melarikan diri dalam JavaScript, tetapi lakukan dalam banyak rasa lainnya. Mereka melarikan diri di sini kalau-kalau ekspresi reguler nanti akan diteruskan ke program lain.
Jika Anda juga perlu untuk membuktikan di masa depan ekspresi reguler terhadap potensi penambahan kemampuan mesin regex JavaScript, saya sarankan menggunakan yang lebih paranoid:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Fungsi ini lolos dari setiap karakter kecuali yang dijamin secara eksplisit tidak akan digunakan untuk sintaks dalam rasa ekspresi reguler di masa mendatang.
Untuk yang benar-benar sanitasi, pertimbangkan kasus tepi ini:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Ini harus dikompilasi dengan baik dalam JavaScript, tetapi tidak dalam beberapa rasa lainnya. Jika ingin beralih ke rasa lain, null case s === ''
harus diperiksa secara independen, seperti:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
sedang bekerja dan siapa pun yang berpikir mereka memiliki input yang berharga sangat dipersilakan untuk berkontribusi. core-js dan polyfill lain menawarkannya.