Większość wyrażeń tutaj rozwiązuje pojedyncze przypadki użycia.
W porządku, ale wolę podejście „zawsze działa”.
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Spowoduje to „całkowite uniknięcie” literału dla dowolnego z poniższych zastosowań w wyrażeniach regularnych:
- Wstawienie w wyrażeniu regularnym. Na przykład
new RegExp(regExpEscape(str))
- Wstawienie do klasy postaci. Na przykład
new RegExp('[' + regExpEscape(str) + ']')
- Wstawienie do specyfikatora liczby całkowitej. Na przykład
new RegExp('x{1,' + regExpEscape(str) + '}')
- Wykonanie w silnikach wyrażeń regularnych innych niż JavaScript.
Objęte znaki specjalne:
-
: Tworzy zakres znaków w klasie znaków.
[
/ ]
: Zaczyna / kończy klasę znaków.
{
/ }
: Uruchamia / kończy specyfikator numeracji.
(
/ )
: Zaczyna / kończy grupę.
*
/ +
/ ?
: Określa typ powtarzania.
.
: Pasuje do dowolnej postaci.
\
: Ucieka znaki i uruchamia byty.
^
: Określa początek pasującej strefy i neguje dopasowanie w klasie znaków.
$
: Określa koniec pasującej strefy.
|
: Określa naprzemienność.
#
: Określa komentarz w trybie wolnych odstępów.
\s
: Ignorowane w trybie swobodnych odstępów.
,
: Oddziela wartości w specyfikatorze numeracji.
/
: Rozpoczyna lub kończy wyrażenie.
:
: Uzupełnia specjalne typy grup i część klas postaci w stylu Perla.
!
: Neguje grupę o zerowej szerokości.
<
/ =
: Część specyfikacji grupy o zerowej szerokości.
Uwagi:
/
nie jest absolutnie konieczne w żadnym smaku wyrażenia regularnego. Jednakże, chroni w przypadku gdy ktoś (Dreszcz) robi eval("/" + pattern + "/");
.
,
zapewnia, że jeśli ciąg ma być liczbą całkowitą w specyfikatorze liczbowym, poprawnie spowoduje błąd kompilacji RegExp zamiast kompilacji po cichu niepoprawnej.
#
i \s
nie trzeba zmieniać znaczenia w JavaScript, ale w wielu innych odmianach. Są one tutaj usuwane na wypadek, gdyby wyrażenie regularne zostało później przekazane do innego programu.
Jeśli potrzebujesz również w przyszłości zabezpieczyć wyrażenie regularne przed potencjalnymi dodatkami do możliwości silnika regex JavaScript, zalecam użycie bardziej paranoicznej:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Ta funkcja unika każdego znaku z wyjątkiem tych, które wyraźnie gwarantują, że nie zostaną użyte w składni w przyszłych smakach wyrażeń regularnych.
Jeśli naprawdę zależy Ci na higienie, rozważ ten przypadek:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
To powinno dobrze skompilować się w JavaScript, ale nie będzie w innych smakach. Jeśli zamierzasz przejść do innego smaku, zerowy przypadek s === ''
powinien być niezależnie sprawdzony, tak jak:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
obecnie pracujemy, a każdy, kto uważa, że mają cenny wkład, jest bardzo mile widziany. Core-js i inne wypełniacze to oferują.