Con i letterali stringa questo è abbastanza facile.
Non proprio! L'esempio sostituisce solo la prima occorrenza di string_to_replace. Più comunemente si desidera sostituire tutte le occorrenze, nel qual caso è necessario convertire la stringa in un /.../gRegExp globale ( ). Puoi farlo da una stringa usando il new RegExpcostruttore:
new RegExp(string_to_replace, 'g')
Il problema è che qualsiasi carattere speciale di regex nella stringa letterale si comporterà in modi speciali invece di essere caratteri normali. Dovresti eseguire il backslash-escape per risolverlo. Sfortunatamente, non esiste una funzione integrata per farlo, quindi eccone una che puoi usare:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Si noti inoltre che quando si utilizza un RegExp in replace(), la stringa di sostituzione ha ora un carattere speciale anche $. Questo deve essere evitato anche se vuoi avere un valore letterale $nel testo di sostituzione!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Quattro $s perché questa è di per sé una stringa di sostituzione - argh!)
Ora puoi implementare la sostituzione globale di stringhe con RegExp:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
Che dolore. Fortunatamente se tutto ciò che vuoi fare è sostituire una stringa dritta senza parti aggiuntive di regex, c'è un modo più veloce:
s.split(string_to_replace).join(replacement)
...e questo è tutto. Questo è un linguaggio comunemente inteso.
dire che voglio sostituire tutto tranne string_to_replace
Cosa significa che vuoi sostituire tutti i tratti di testo che non prendono parte a una corrispondenza con la stringa? Una sostituzione ^sicuramente non lo fa, perché ^significa un token di inizio stringa, non una negazione. ^è solo una negazione nei []gruppi di caratteri. Ci sono anche punti di vista negativi (?!...), ma ci sono problemi con quello in JScript, quindi dovresti generalmente evitarlo.
Potresti provare ad abbinare "tutto fino a" la stringa e usare una funzione per scartare qualsiasi tratto vuoto tra stringhe corrispondenti:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Anche in questo caso, una divisione potrebbe essere più semplice:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
/delimitatori regex quando usi anche questo modulo.