702 votes

A utiliser dans

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?

1407voto

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")
}());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X