Buradaki ifadelerin çoğu tek kullanımlık durumları çözer.
Sorun değil, ama "her zaman işe yarar" yaklaşımını tercih ederim.
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Bu, normal ifadelerde aşağıdaki kullanımlardan herhangi biri için değişmez bir dizeden "tamamen kaçar":
- Normal ifadeye ekleme. Örneğin
new RegExp(regExpEscape(str))
- Bir karakter sınıfına ekleme. Örneğin
new RegExp('[' + regExpEscape(str) + ']')
- Tamsayı sayısı belirleyicisine ekleme. Örneğin
new RegExp('x{1,' + regExpEscape(str) + '}')
- JavaScript olmayan normal ifade motorlarında yürütme.
Kapsanan Özel Karakterler:
-
: Karakter sınıfında bir karakter aralığı oluşturur.
[
/ ]
: Karakter sınıfını başlatır / bitirir.
{
/ }
: Bir numara belirleyiciyi başlatır / sonlandırır.
(
/ )
: Bir grubu başlatır / bitirir.
*
/ +
/ ?
: Tekrarlama türünü belirtir.
.
: Herhangi bir karakterle eşleşir.
\
: Karakterlerden kaçar ve objeleri başlatır.
^
: Eşleme bölgesinin başlangıcını belirtir ve bir karakter sınıfındaki eşleşmeyi reddeder.
$
: Eşleşen bölgenin sonunu belirtir.
|
: Değişimi belirtir.
#
: Boş aralık modunda yorumu belirtir.
\s
: Boş aralık modunda yok sayılır.
,
: Sayı belirleyicisindeki değerleri ayırır.
/
: İfadeyi başlatır veya bitirir.
:
: Özel grup türlerini ve Perl tarzı karakter sınıflarının bir bölümünü tamamlar.
!
: Sıfır genişlikli grubu olumsuzlar.
<
/ =
: Sıfır genişlikli grup özelliklerinin bir parçası.
Notlar:
/
düzenli ifadenin herhangi bir çeşidinde kesinlikle gerekli değildir. Bununla birlikte, birisinin (ürperti) yapması durumunda korur eval("/" + pattern + "/");
.
,
dizenin sayısal belirleyicide bir tamsayı olması gerekiyorsa, sessizce yanlış derlemek yerine bir RegExp derleme hatasına neden olur.
#
ve \s
JavaScript'ten kaçmasına gerek yoktur, ancak diğer birçok aromada da kullanılır. Düzenli ifadenin daha sonra başka bir programa geçmesi durumunda buradan kaçarlar.
Ayrıca, düzenli ifadeyi JavaScript normal ifade motoru özelliklerine olası eklemelere karşı gelecekte kanıtlamanız gerekiyorsa, daha paranoyak kullanmanızı öneririz:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Bu işlev, gelecekteki düzenli ifade tatlarında sözdizimi için kullanılmayacağı açıkça garanti edilenler dışında her karakterden kaçar.
Gerçekten sanitasyon meraklısı için, bu son durumu düşünün:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Bu gerektiğini değil diğer bazı tatlar JavaScript cezası derlemek, ama olacak. Başka bir lezzete geçmek niyetinde ise, null durumu s === ''
bağımsız olarak kontrol edilmelidir, şöyle:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
üzerinde çalışılan ince halk güncellemek istedim ve değerli girdisi olduğunu düşünen herkes katkıda bulunmak çok hoş geldiniz. core-js ve diğer çoklu dolgular bunu sunuyor.