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 \snie 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.escapeobecnie pracujemy, a każdy, kto uważa, że mają cenny wkład, jest bardzo mile widziany. Core-js i inne wypełniacze to oferują.