Double Possible:
Est-il une RegExp.s'échapper de la fonction en Javascript?Je suis en train de construire une regex en javascript basé sur la saisie de l'utilisateur:
fonction FindString(input) { var reg = new RegExp(" + entrée + "); // [snip] d'effectuer une recherche }Mais les regex ne fonctionne pas correctement lors de la saisie de l'utilisateur contient un
?
ou*
parce qu'ils sont interprétés comme des regex spéciaux. En fait, si l'utilisateur met un déséquilibre(
ou[
dans leur chaîne, la regex n'est pas encore valide.Quelle est la fonction javascript correctement échapper tous les caractères spéciaux pour une utilisation dans les regex?
Cette question a déjà des réponses:
- Existe-t-il une fonction RegExp.escape en JavaScript ? (5 réponses )
Réponse
Trop de publicités?
CoolAJ86
Points
19341
Bref, " n Sucré
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
Voir MDN: Javascript Guide: les Expressions Régulières
escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]");
>>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \] "
D'autres symboles (~`!@# ...) PEUT-être échappé sans conséquence, mais ne sont pas tenus d'être.
.
.
.
.
Cas de Test: Un typique url
escapeRegExp("/path/to/resource.html?search=query");
>>> "\/path\/to\/resource\.html\?search=query"
La Réponse Longue
Si vous allez utiliser la fonction ci-dessus au moins un lien à ce débordement de pile post dans votre code, de la documentation, de sorte qu'il n'a pas l'air comme une folle en dur-pour-test vaudou.
var escapeRegExp;
(function () {
// Referring to the table here:
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp
// these characters should be escaped
// \ ^ $ * + ? . ( ) | { } [ ]
// These characters only have special meaning inside of brackets
// they do not need to be escaped, but they MAY be escaped
// without any adverse effects (to the best of my knowledge and casual testing)
// : ! , =
// my test "~!@#$%^&*(){}[]`/=?+\|-_;:'\",<.>".match(/[\#]/g)
var specials = [
// order matters for these
"-"
, "["
, "]"
// order doesn't matter for any of these
, "/"
, "{"
, "}"
, "("
, ")"
, "*"
, "+"
, "?"
, "."
, "\\"
, "^"
, "$"
, "|"
]
// I choose to escape every character with '\'
// even though only some strictly require it when inside of []
, regex = RegExp('[' + specials.join('\\') + ']', 'g')
;
escapeRegExp = function (str) {
return str.replace(regex, "\\$&");
};
// test escapeRegExp("/path/to/res?search=this.that")
}());