375 votos

Escapar de la cadena para su uso en Javascript regex

Posibles Duplicados:
Hay una RegExp.escape de la función en Javascript?

Estoy tratando de construir un javascript regex basado en la entrada de usuario:

función FindString(entrada) {
 var reg = new RegExp(" + entrada + ");
 // [snip] realizar la búsqueda
}

Pero la regex no funcionará correctamente cuando el usuario de entrada contiene un ? o * porque son interpretados como expresiones especiales. De hecho, si el usuario pone un desequilibrado ( o [ en su cadena, la expresión no es válida.

¿Cuál es la función de javascript correctamente escapar de todos los caracteres especiales para su uso en la expresión regular?

782voto

CoolAJ86 Puntos 19341

Corto 'n Dulce

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

Ver MDN: Javascript Guía: Expresiones Regulares

escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]");

>>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \] "

Otros símbolos (~`!@# ...) PUEDE ser escapado sin consecuencia, pero no es obligatorio.

.

.

.

.

Caso de prueba: Una típica url

escapeRegExp("/path/to/resource.html?search=query");

>>> "\/path\/to\/resource\.html\?search=query"

El Tiempo De Respuesta

Si usted va a utilizar la función de arriba, al menos, enlace a este desbordamiento de la pila de post en el código de la documentación a fin de que no parezca una locura difícil de la prueba de vudú.

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X