2009-01-28 58 views
42

Duplicar posibles:
Escape string for use in Javascript regexpaso variable para una expresión regular en javascript

Tengo un msg así:

Max {0} CARACTERES permitido en { 1}

y yo tenemos una función para crear un mensaje utilizando los argumentos que se pasan como

for(var i = 0; i < agrs.length; i++){ 
    reg = new RegExp('\{'+i+'\}', 'gi'); 
    key = key.replace(reg,agrs[i]) 
} 

El problema es que no es capaz de tomar el parámetro i para crear la exp reg.

¿Cuál es la manera de lograr esto?

+2

@casperOne, ¿cuál es el duplicado? Ni [esta pregunta] (http://stackoverflow.com/questions/4029109/javascript-regex-how-to-put-a-variable-inside-a-regular-expression) ni [esta pregunta] (http: // stackoverflow.com/questions/494035/how-do-you-pass-a-variable-to-a-regular-expression-javascript) fueron los mismos que esta pregunta. Esta pregunta es importante porque muestra realmente la mezcla de una variable de cadena en un patrón de expresión regular, mientras que las respuestas de las otras preguntas solo proporcionaron ejemplos donde el escape de los caracteres no era un problema. – MandM

Respuesta

52

Su expresión regular es /{0}/gi ya que la crea desde una cadena. Y no es una expresión válida. tiene que escapar {en la expresión regular, ya que tiene un significado especial en la sintaxis de expresiones regulares, por lo que debe ser:

new RegExp('\\{'+i+'\\}', 'gi'); 

cuales es /\\{0\\}/gi. Necesita escapar escapándose \\ en la cadena.

+0

funcionó como la brisa fresca. Gracias. – Nrj

3

Creo que su segunda línea se supone que es

reg = new RegExp('\{'+i+'\}', 'gi'); 

pero no sé si ese es su único problema o no.

+0

Sí, es así, pero no permite crear uno. Dice "cuantificador inválido". – Nrj

6

Le recomiendo encarecidamente que utilice la forma funcional de String.replace() para resolver su problema, en lugar de intentar parametrizar la expresión regular en un for-loop que itera sobre {0}, {1}, etc.

En otras palabras, en lugar de buscar '{0}' o '{1}', simplemente busque '{([0-9] +)}' (es decir {} rodeando un número arbitrario, y pasa una función a la función replace() para reemplazar inteligentemente estas expresiones en función del número entre {} 's. Esto le permite usar un literal RegExp que puede escribir como/{([0-9] +)}/. en lugar de perder el tiempo con caracteres de escape en cadenas

Algo como esto:

s='the song says {0} little {1} little {2} little-endians'; 
args=['zero','one','two']; 
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch) 
    {return args[(+firstmatch)]; } 
); 

que produce

the song says zero little one little two little-endians 

Consulte este similar question.

edición: si desea dejar objetos por sí solos que son mayores que la longitud de su lista args, asegúrese de cordura a comprobar el número de parámetro:

s='the song says {0} little {1} little {2} little-endians,\n'+ 
    ' {3} little {4} little {5} little-endians'; 
args=['zero','one','two']; 
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch) 
    {var i = +firstmatch; return i < args.length ? args[i] : wholematch;} 
); 

que produce

the song says zero little one little two little-endians, 
{3} little {4} little {5} little-endians 
Cuestiones relacionadas