Estou tentando substituir várias palavras em uma string por várias outras palavras. A sequência é "Eu tenho um gato, um cachorro e uma cabra".
No entanto, isso não produz "Eu tenho um cachorro, uma cabra e um gato", mas produz "Eu tenho um gato, um gato e um gato". É possível substituir várias seqüências de caracteres por várias outras ao mesmo tempo em JavaScript, para que o resultado correto seja produzido?
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");
//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".
Respostas:
Solução específica
Você pode usar uma função para substituir cada uma.
exemplo jsfiddle
Generalizando
Se você deseja manter dinamicamente a regex e apenas adicionar trocas futuras ao mapa, você pode fazer isso
para gerar o regex. Então, ficaria assim
E para adicionar ou alterar mais substituições, você pode apenas editar o mapa.
violino com regex dinâmico
Tornando reutilizável
Se você deseja que este seja um padrão geral, você pode extrair isso para uma função como esta
Então, você pode simplesmente passar a string e um mapa das substituições que deseja para a função e ela retornará a string transformada.
mexer com função
Para garantir que Object.keys funcione em navegadores mais antigos, adicione um polyfill, por exemplo, do MDN ou Es5 .
fonte
.
notação com todas essas propriedades. A notação de colchetes funciona com qualquer string.map={'.': ',', ',': '.'}
e regex/\.|,/g
.return mapObj[matched.toLowerCase()];
apenasreturn mapObj[matched];
uma vez que uso chaves com distinção entre maiúsculas e minúsculasmapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Inspirado por esta respostaIsso pode não atender à sua necessidade exata neste caso, mas achei uma maneira útil de substituir vários parâmetros em strings, como uma solução geral. Ele substituirá todas as instâncias dos parâmetros, não importa quantas vezes eles sejam referenciados:
Você o chamaria da seguinte maneira:
fonte
Use itens numerados para evitar a substituição novamente. por exemplo
então
Como funciona: -% \ d + localiza os números que vêm após um%. Os colchetes capturam o número.
Esse número (como uma string) é o segundo parâmetro, n, da função lambda.
O + n-1 converte a string no número e 1 é subtraído para indexar a matriz de animais de estimação.
O número% é então substituído pela string no índice da matriz.
O / g faz com que a função lambda seja chamada repetidamente com cada número que é substituído por uma sequência da matriz.
No JavaScript moderno: -
fonte
Isso funcionou para mim:
fonte
usando Array.prototype.reduce () :
Exemplo
fonte
${f}
vez de f, para o valor acumulado?${f}
.replace (new RegExp (Object.keys (s) [ 0], 'g'), s [Object.keys (s) [0]]), frase1) "Caso alguém esteja se perguntando por que a solução do pôster original não está funcionando:
fonte
função regular do usuário para definir o padrão a ser substituído e, em seguida, use a função de substituição para trabalhar na sequência de entrada,
fonte
RegExp
objeto poderia resolver o problemavar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Com o meu pacote de substituição única , você pode fazer o seguinte:
fonte
fonte
Você pode encontrar e substituir a string usando delimitadores.
fonte
/ * replaceSome método para seqüências de caracteres que leva, quantos argumentos quisermos e substitui todos eles pelo último argumento que especificamos 2013 CopyRights salvos para: Max Ahmed, este é um exemplo:
* /
jsFiddle: http://jsfiddle.net/CPj89/
fonte
fonte
Eu escrevi este pacote npm stringinject https://www.npmjs.com/package/stringinject que permite que você faça o seguinte
que substituirá {0} e {1} pelos itens da matriz e retornará a seguinte string
ou você pode substituir espaços reservados por chaves e valores de objetos da seguinte maneira:
fonte
Você pode usar https://www.npmjs.com/package/union-replacer para essa finalidade. É basicamente uma
string.replace(regexp, ...)
contrapartida, que permite que várias substituições ocorram em uma única passagem, preservando a potência total destring.replace(...)
.Divulgação: Eu sou o autor. A biblioteca foi desenvolvida para oferecer suporte a substituições mais complexas configuráveis pelo usuário e aborda todas as questões problemáticas, como grupos de captura, referências anteriores e substituições de funções de retorno de chamada.
As soluções acima são boas o suficiente para substituições exatas de cordas.
fonte
Expandi um pouco o @BenMcCormicks. Ele trabalhou para cordas regulares, mas não se eu tivesse escapado de caracteres ou curingas. Aqui está o que eu fiz
retorna "blá blá 234433 blá blá"
Dessa forma, ele corresponderá à chave no mapObj e não à palavra correspondente '
fonte
Solução com o Jquery (primeiro inclua este arquivo): Substitua várias strings por várias outras strings:
fonte
javascript tag added in question, and jquery is a libarary of javascript.
Hmmm, a lógica está desativada, deve ser o contrário, e também apenas um aviso - a partir das informações da tag javascript: " A menos que outra tag para uma estrutura / biblioteca também esteja incluída, é esperada uma resposta JavaScript pura. "