2010-03-15 12 views
73

Puede retrorreferencia como esto en JavaScript:JavaScript - cadena de referencias hacia atrás de expresiones regulares

var str = "123 $test 123"; 
str = str.replace(/(\$)([a-z]+)/gi, "$2"); 

Esto sería (bastante tonta) reemplazar "$ test" con la "prueba". Pero imagine que me gustaría pasar la cadena resultante de $ 2 en una función, que devuelve otro valor. Intenté hacer esto, pero en vez de obtener la cadena "prueba", obtengo "$ 2". ¿Hay una manera de lograr esto?

// Instead of getting "$2" passed into somefunc, I want "test" 
// (i.e. the result of the regex) 
str = str.replace(/(\$)([a-z]+)/gi, somefunc("$2")); 

Respuesta

103

De esta manera:

str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); }) 
+0

impresionante, ¿dónde puedo encontrar más información sobre esto? – quano

+7

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace – SLaks

+10

Cool. Para aclarar: '$ 1' y' $ 2' son nombres de parámetros elegidos por el usuario aquí (elegidos para imitar los símbolos de referencia); el - variando! - el número de estos parámetros corresponde al número de grupos de captura en la expresión regular. – mklement0

28

pasar una función como segundo argumento a replace:

str = str.replace(/(\$)([a-z]+)/gi, myReplace); 

function myReplace(str, group1, group2) { 
    return "+" + group2 + "+"; 
} 

Esta capacidad ha estado presente desde el Javascript 1.3, de acuerdo con mozilla.org.

-1

Nota: A la respuesta anterior le faltaba algún código. Ahora está fijo + ejemplo.


necesitaba algo un poco más flexible para sustituir una expresión regular para decodificar el Unicode en mis datos JSON entrante:

var text = "some string with an encoded 's' in it"; 

text.replace(/&#(\d+);/g, function() { 
    return String.fromCharCode(arguments[1]); 
}); 

// "some string with an encoded 's' in it" 
Cuestiones relacionadas