Pregunta

En expresiones regulares de Perl, puede rodear una subexpresión con \Q y \E Para indicar que desea que esa subexpresión se coincida como una cadena literal incluso si hay metacharacteres allí. También tienes el quotemeta Función que inserta exactamente el número correcto de barras de retroceso en una cadena de modo que si posteriormente interpola esa cadena en una expresión regular, se igualará literalmente, sin importar cuáles fueran su contenido.

¿JavaScript (como se implementa en los principales navegadores) tiene algún incorporado ¿equivalente? Puedo escribir el mío bien, pero me gustaría saber si no tengo que molestarme.

¿Fue útil?

Solución

No existe tal característica incorporada.

En lugar de implementar el suyo, le aconsejo que busque la multitud de Funciones de escape de regex Disponible en Internet.

Esa página propone la siguiente solución (por Colin Snover):

RegExp.escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

o aconseja usar el Xregexp biblioteca.

Otros consejos

Quotemeta no se implementa de forma nativa que yo sepa, pero he usado esto hace unos meses para esto:

function quotemeta (str) {
  // http://kevin.vanzonneveld.net
  // +   original by: Paulo Freitas
  // *     example 1: quotemeta(". + * ? ^ ( $ )");
  // *     returns 1: '\. \+ \* \? \^ \( \$ \)'
  return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1');
}

De http://phpjs.org/functions/quotemeta:496

También hay un módulo de cotemeta npm, que puede usar en Node.js o en el navegador. La implementación es citar todos los caracteres que no son palabras (abreviadas para [^a-zA-Z0-9_]).

String(str).replace(/(\W)/g, '\\$1');

Esto funciona porque todos los personajes que necesitan escapar no son palabras, mientras que los otros personajes que terminan escapando son inofensivos. Por ejemplo, aquí el porcentaje de personaje se escape, pero aún coincide normalmente en el regexp, aunque no necesitaba ser escapado:

if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); } 

```

Alguien ha bifurcado el quotemeta módulo y señaló que no se necesitan los parens capturados, por lo que el regex puede simplificarse aún más así:

String(str).replace(/\W/g, '\\$&');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top