2010-03-15 10 views
73

È possibile backreference come questo in JavaScript:JavaScript - stringa backreference regex

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

Questo sarebbe (abbastanza stupido) Sostituire "$ test" con "test". Ma immagina che mi piacerebbe passare la stringa risultante di $ 2 in una funzione, che restituisce un altro valore. Ho provato a farlo, ma invece di ottenere la stringa "test", ottengo "$ 2". C'è un modo per ottenere questo?

// 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")); 

risposta

103

Ti piace questa:

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

Impressionante, dove posso trovare maggiori informazioni su questo? – quano

+7

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

+10

Freddo. Per chiarire: '$ 1' e' $ 2' sono i nomi dei parametri scelti dall'utente qui (scelti per imitare i simboli di riferimento); il - variando! - il numero di questi parametri corrisponde al numero di gruppi di cattura nella regex. – mklement0

28

passare una funzione come secondo argomento a replace:

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

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

Questa capacità è stato intorno dal Javascript 1.3, secondo mozilla.org.

-1

Nota: Nella precedente risposta mancava del codice. Ora è corretto + esempio.


Avevo bisogno di qualcosa di un po 'più flessibile per una regex sostituire per decodificare l'unicode nel mio dati JSON in entrata:

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"