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?
Respuesta
¿Demasiados anuncios?
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")
}());