Com literais de string, isso é fácil.
Na verdade não! O exemplo substitui apenas a primeira ocorrência de string_to_replace
. Mais comumente, você deseja substituir todas as ocorrências; nesse caso, você precisa converter a sequência em um /.../g
RegExp global ( ). Você pode fazer isso a partir de uma string usando o new RegExp
construtor:
new RegExp(string_to_replace, 'g')
O problema é que qualquer caractere especial de regex na literal de cadeia se comportará de maneira especial, em vez de ser caracteres normais. Você teria que escapar com uma barra invertida para consertar isso. Infelizmente, não há uma função interna para fazer isso por você, então aqui está uma que você pode usar:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Observe também que quando você usa um RegExp replace()
, a cadeia de substituição agora também possui um caractere especial $
. Isso também deve ser evitado se você quiser ter um literal $
no seu texto de substituição!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Quatro $
s porque essa é uma string de substituição - argh!)
Agora você pode implementar a substituição global de cadeias com o 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);
}
Que dor. Felizmente, se tudo o que você quer fazer é substituir uma string reta sem partes adicionais do regex, existe uma maneira mais rápida:
s.split(string_to_replace).join(replacement)
...e isso é tudo. Este é um idioma comumente entendido.
digamos que quero substituir tudo, mas string_to_replace
O que isso significa, você deseja substituir todos os trechos de texto que não participam de uma correspondência contra a sequência? Uma substituição por ^
certamente não faz isso, porque ^
significa um token de início de cadeia, não uma negação. ^
é apenas uma negação em []
grupos de caracteres. Também existem lookaheads negativos (?!...)
, mas há problemas com isso no JScript, portanto, você geralmente deve evitá-lo.
Você pode tentar combinar 'tudo até' a string e usar uma função para descartar qualquer extensão vazia entre as strings correspondentes:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Aqui, novamente, uma divisão pode ser mais simples:
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);
/
delimitadores de regex ao usar este formulário também.