2011-06-11 7 views
15

En expresiones regulares de Perl, puede rodear una subexpresión con \Q y \E para indicar que desea que esa subexpresión coincida como una cadena literal incluso si hay metacaracteres allí. También tiene la función quotemeta que inserta exactamente el número correcto de barras invertidas en una cadena, de modo que si posteriormente interpola esa cadena en una expresión regular, se combinará literalmente, sin importar su contenido.equivalente de Javascript de Perl Q ... E o quotemeta()

¿Tiene Javascript (implementado en los principales navegadores) incorporado en equivalente? Puedo escribir lo mío bien, pero me gustaría saber si no tengo que molestarme.

Respuesta

14

No hay tal característica incorporada.

En lugar de implementar la suya, le aconsejo que busque en la multitud de regex escape functions 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 utilizar la biblioteca XRegExp.

+3

Gracias. Nota para cualquiera que haga clic en el enlace: lea hasta el final para la versión * correcta * de la rutina. – zwol

5

Quotemeta no está implementado de forma nativa por lo que yo sé, pero he utilizado esto hace unos meses por sólo 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

+0

adora la buena implementación directa – ZJR

1

También hay un quotemeta npm module, que se puede usar en node.js o en el navegador. La implementación consiste en citar todos los caracteres que no son palabras, (abreviatura de [^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 obteniendo de escape son inofensivos. Por ejemplo, aquí el carácter de porcentaje se escapó, pero todavía coincide normalmente en la expresión regular, aunque no necesita ser escapado:

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

`` `

Alguien se ha dividido el módulo y quotemeta señaló que no es necesario capturar parens, por lo que la expresión regular se puede simplificar aún más así:

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

Tenga en cuenta que esto romperá los pares sustituidos rompiéndolos con una barra invertida en el medio, caracteres corruptos como – Kovensky

+0

Si hay una solución, envíe un mensaje al módulo quotemeta y edite esta respuesta. –

Cuestiones relacionadas