javascript — Como substituir todas as ocorrências de uma string em JavaScript
/Como substituir todas as ocorrências de uma string em JavaScript
parece remover apenas a primeira ocorrência de abc na string acima. Como posso substituir todas ocorrências dele?
17 de jul. de 2009 Click Upvote
Por uma questão de perfeição, comecei a pensar em qual método eu deveria usar para fazer isso. Existem basicamente duas maneiras de fazer isso, conforme sugerido pelas outras respostas nesta página.
Note: Em geral, estender os protótipos embutidos em JavaScript geralmente não é recomendado. Eu estou fornecendo como extensões no protótipo String simplesmente para fins de ilustração, mostrando diferentes implementações de um método padrão hipotético no protótipo interno String.
Implementação Baseada em Expressões Regulares
Dividir e unir (funcional) a implementação
Não sabendo muito sobre como as expressões regulares funcionam nos bastidores em termos de eficiência, eu tendia a inclinar-se para a divisão e participar da implementação no passado sem pensar no desempenho. Quando eu me perguntei qual era mais eficiente, e com que margem, eu usei isso como uma desculpa para descobrir.
Na minha máquina com o Windows 8 do Chrome, a implementação baseada na expressão regular é a mais rápida, com o a implementação de divisão e junção é 53% mais lenta. O que significa que as expressões regulares são duas vezes mais rápidas para a entrada lorem ipsum que usei.
Confira este benchmark executando essas duas implementações uma contra a outra.
Como observado no comentário abaixo por @ThomasLeduc e outros, pode haver um problema com a implementação baseada em expressões regulares se search contiver certos caracteres reservados como caracteres especiais em expressões regulares . A implementação pressupõe que o chamador irá escapar a seqüência de caracteres com antecedência ou somente passará seqüências de caracteres que estão sem os caracteres na tabela em expressões regulares (MDN).
O MDN também fornece uma implementação para escapar de nossas strings. Seria legal se isso também fosse padronizado como RegExp.escape(str), mas, infelizmente, ele não existe:
Poderíamos chamar escapeRegExp dentro de nossa implementação de String.prototype.replaceAll, no entanto, não tenho certeza de quanto isso afetará o desempenho (potencialmente até para strings para as quais a fuga não é necessária, como todas as cadeias alfanuméricas).
12 de jul. de 2013 Cory Gross
Em resposta ao Clique no comentário do Upvote , você pode simplificá-lo ainda mais:
Nota: As expressões regulares contêm (meta) caracteres especiais e, como tal, é perigoso passar cegamente um argumento na função find acima sem pré-processá-lo para escapar desses caracteres. Isto é coberto no Mozilla Developer Network 's Guia JavaScript em Expressões Regulares , onde eles apresentam a seguinte função de utilidade:
Então, para tornar a função replaceAll() acima mais segura, ela pode ser modificada para o seguinte, se você incluir também escapeRegExp:
Como alternativa às expressões regulares para uma string literal simples, você poderia usar
Isso costumava ser mais rápido em alguns casos do que usar replaceAll e uma expressão regular, mas isso não parece mais ser o caso em navegadores modernos. Então, isso deve ser usado apenas como um truque rápido para evitar a necessidade de escapar da expressão regular, não em código real.
17 de jul. de 2009 Matthew Crumley
Usar uma expressão regular com o conjunto de sinalizadores g substituirá todos:
7 de mai. de 2009 Adam A
Se a sua find tiver caracteres especiais, você precisará escapar deles:
12 de fev. de 2013 jesal
É um pouco tarde para uma atualização, mas desde que eu acabei de tropeçar nesta questão, e notei que a minha resposta anterior não é uma com a qual estou feliz. Como a questão envolvia substituir uma única palavra, é incrível que ninguém pensasse em usar limites do Word (\b)
Essa é uma regex simples que evita a substituição de partes de palavras na maioria dos casos. No entanto, um traço - ainda é considerado um limite do Word. Portanto, condicionais podem ser usados ​​neste caso para evitar a substituição de strings como cool-cat:
basicamente, esta questão é a mesma que a pergunta aqui: Javascript substituir "'" por "' '"
@Mike, verifique a resposta que eu dei lá ... regexp não é a única maneira de substituir múltiplas ocorrências de uma subclasse, longe disso. Pense flexível, pense em dividir!
Como alternativa, para evitar a substituição de partes do Word, o que a resposta aprovada também fará! Você pode contornar este problema usando expressões regulares que, eu admito, são um pouco mais complexas e, como resultado disso, um pouco mais lento também:
A saída é a mesma que a resposta aceita, no entanto, usando a expressão/cat/g nesta string:
Opa, isso provavelmente não é o que você quer. O que é então? IMHO, um regex que apenas substitui "cat" condicionalmente. (ou seja, não faz parte de uma palavra), assim:
Meu palpite é que isso atende às suas necessidades. Não é à prova de cheio, é claro, mas deve ser o suficiente para você começar. Eu recomendaria ler mais sobre essas páginas. Isso será útil no aperfeiçoamento dessa expressão para atender às suas necessidades específicas.
Adição final:
Como essa questão ainda recebe muitos pontos de vista, pensei em adicionar um exemplo de .replace usado com uma função de retorno de chamada. Neste caso, simplifica dramaticamente a expressão e fornece ainda mais flexibilidade, como substituir com letras maiúsculas corretas ou substituir cat e cats de uma só vez:
1 de mar. de 2012 Elias Van Ootegem
7 de mai. de 2009 scronide
Ou tente a função replaceAll aqui:
Quais são os métodos JavaScript úteis que estendem objetos internos?
EDIT: Esclarecimento sobre substituirTodas as disponibilidades
O método 'replaceAll' é adicionado ao protótipo do String. Isso significa que estará disponível para todos os objetos/literais de string.
17 de jul. de 2009 SolutionYogi
10 de set. de 2016 Emilio Grisolía
Estes são os métodos mais comuns e legíveis.
Método-01:
Método-02:
Método-03:
Método-04:
25 de mar. de 2019 Adnan Toky
17 de jul. de 2009 Donnie DeBoer
20 de jun. de 2015 Chris Rosete
// faça um loop até que a quantidade de ocorrências chegue a 0. OR simplesmente copie/cole
5 de jun. de 2013 Raseela
Esta é a versão mais rápida que não usa expressões regulares.
Revisado jsperf
É quase duas vezes tão rápido quanto o método split e join.
Como apontado em um comentário aqui, isso não funcionará se sua variável omit contiver place, como em: replaceAll("string", "s", "ss"), porque sempre poderá substituir outra ocorrência do Word.
Atualização de 27 de julho de 2017: parece que o RegExp agora tem o desempenho mais rápido no recém-lançado Chrome 59.
4 de abr. de 2014 Cole Lawrence
funcionou melhor para mim do que as respostas acima. então new RegExp("abc", 'g') cria um RegExp que corresponde a todas as ocorrências ('g' flag) do texto ("abc"). A segunda parte é substituída por, no seu caso, string vazia (""). str é a string, e nós temos que sobrescrevê-la, pois replace(...) apenas retorna o resultado, mas não substitui. Em alguns casos, você pode querer usar isso.
28 de dez. de 2017 csomakk
Usando RegExp em JavaScript poderia fazer o trabalho para você, simplesmente faça algo como abaixo, não esqueça do /g após qual destaque para global :
Mas como eu mencionei anteriormente, isso não fará uma grande diferença em termos de linhas a serem escritas ou performance, somente o cache da função pode afetar um desempenho mais rápido em strings longas e também uma boa prática de código DRY se você deseja reutilizar.
6 de jun. de 2017 Alireza
Se o que você quer encontrar já está em uma string, e você não tem um escapador regex à mão, você pode usar join/split:
20 de jun. de 2013 rakslice
29 de set. de 2014 Tim Rivoli
15 de mai. de 2013 Owen
4 de set. de 2013 pkdkk
29 de abr. de 2014 zdennis
Se a string contiver padrões semelhantes, como abccc, você poderá usar isto:
7 de out. de 2017 mostafa elmadany
As respostas anteriores são muito complicadas. Apenas use a função replace assim:
23 de out. de 2018 Black
Se você está tentando garantir que a string que você está procurando não exista mesmo após a substituição, você precisa usar um loop.
Quando terminar, você ainda terá 'teste abc'!
O loop mais simples para resolver isso seria:
Mas isso executa a substituição duas vezes para cada ciclo. Talvez (sob risco de ser rejeitado) que pode ser combinado para uma forma um pouco mais eficiente, mas menos legível:
Isso pode ser particularmente útil ao procurar seqüências de caracteres duplicadas.
Por exemplo, se temos 'a , b' e desejamos remover todas as vírgulas duplicadas.
[Nesse caso, pode-se fazer .replace (/, +/g, ','), mas em algum momento a regex se torna complexa e lenta o suficiente para dar um loop.]
28 de set. de 2014 SamGoody
Embora as pessoas mencionaram o uso de regex, mas há uma abordagem melhor se você quiser substituir o texto, independentemente do caso do texto. Como maiúsculas ou minúsculas. Use abaixo da sintaxe
Você pode consultar o exemplo detalhado aqui .
3 de mai. de 2016 Cheezy Code
Eu resolvi esse problema com uma simples linha de código.
Verifique o exemplo no jsfiddle https://jsfiddle.net/pot6whnx/1/
7 de mar. de 2019 Riajul Islam
A seguinte função funciona para mim:
16 de fev. de 2016 Sandeep Gantait
15 de fev. de 2016 tk_
Apenas adicione /g
/g significa global
5 de jun. de 2015 Reza Fahmi
Ele irá substituir todas as ocorrências na string s até que seja possível:
13 de jan. de 2016 Termininja
O caminho mais simples para isso sem usar qualquer regex é dividir e se associar como código aqui:
14 de mai. de 2019 sajadre
A maioria das pessoas provavelmente faz isso para codificar uma URL. Para codificar uma URL, você deve considerar apenas espaços, mas converter a string inteira corretamente com encodeURI.
17 de mar. de 2017 User
Em termos de desempenho relacionado às principais respostas estes são alguns testes online .
Enquanto os seguintes são alguns testes de desempenho usando console.time() (eles funcionam melhor em seu próprio console, o tempo é muito curto para ser visto no snippet)
O interessante é que, se você executá-los várias vezes, os resultados serão sempre diferentes, embora a solução RegExp pareça a mais rápida, em média, e a solução while loop, a mais lenta.
4 de set. de 2018 Ferie
Minha implementação, muito auto-explicativa
28 de out. de 2011 Vitim.us
Para substituir todos os tipos de caracteres, tente este código:
Portanto, esse método resolverá esse problema.
Eu estava usando o Ajax e tive a necessidade de enviar parâmetros no formato JSON. Então meu método está parecendo assim:
24 de dez. de 2013 SiwachGaurav
Nos meus aplicativos, eu uso uma função personalizada que é a mais poderosa para essa finalidade, e mesmo envolvendo a solução split/join no caso mais simples, é um pouco mais rápido em Chrome 60and Firefox 54 ( JSBEN.CH ) do que outras soluções. Meu computador executa Windows 7 64 bits.
A vantagem é que essa função personalizada pode manipular muitas substituições ao mesmo tempo usando strings ou caracteres, o que pode ser um atalho para alguns aplicativos.
Como uma solução acima split/join, a solução abaixo não tem nenhum problema com caracteres de escape, diferentemente da abordagem de expressão regular.
A documentação está abaixo
Para ser justo, eu corri o benchmark sem teste de parâmetro.
Aqui está o meu conjunto de testes, usando Node.js
1 'banana é uma fruta Dope colhida longe do dover'
2 'banana é uma fruta do Dope colhida do dover'
3 'banana é um pe de fruta colhida r a ver'
5 'banana como um rapa fraat harvastad naar tha ravar'
6 'bununu é u ripo frait hurvostod nour tho rivor'
8 falsa
9 'BANANA IS UMA FRUTOS MADUROS COLHIDOS PERTO DO RIO'
10 'BANANA IS Uma Fruta de Colheita Dopada para a Fazenda'
16 de ago. de 2017 Paulo Buchsbaum
Isso pode ser feito usando o Regex. Poucas combinações que podem ajudar alguém,
Para substituir todos os caracteres não alfa,
Para substituir vários espaços contínuos por um espaço,
Para substituir todos os caracteres *,
Para substituir pontos de interrogação (?)
Para substituir aspas,
Para substituir todos os caracteres,
Para substituir um Word específico,
Para substituir a barra invertida,
Para substituir a barra,
Para substituir todos os espaços,
Para substituir pontos,
15 de fev. de 2019 prime
11 de abr. de 2016 theWalker
Aqui está o código de trabalho com o protótipo:
4 de mar. de 2016 Nivesh Saharan
Para valores exclusivos substituíveis
11 de abr. de 2018 TheAivis
Eu uso split e join ou esta funcion
16 de abr. de 2019 VhsPiceros
Tente implementar a expressão regular
"Teste abc teste teste abc teste teste teste abc teste teste abc" .replace (/\abc/g, '');
Dividir e participar. Dividir com abc e juntar-se ao espaço vazio
"Teste abc teste teste abc teste teste teste abc teste teste abc" .split ("abc"). Join ("")
29 de jan. de 2019 ashish
Se usar uma biblioteca for uma opção para você, você obterá os benefícios do teste e do suporte da comunidade que acompanha uma função de biblioteca. Por exemplo, a biblioteca string.js tem uma função replaceAll () que faz o que você está procurando:
14 de set. de 2014 Guy
Na primeira busca de elemento de string e substitua
Na cadeia de pesquisa global e substitua
28 de dez. de 2017 KARTHIKEYAN.A
Eu só quero compartilhar minha solução, com base em alguns dos recursos funcionais das últimas versões do JavaScript:
27 de jan. de 2018 Andrés
Isso pode ser resolvido usando expressões regulares e o sinalizador g, que significa não parar depois de encontrar a primeira correspondência. Realmente, expressões regulares são salva vidas!
15 de out. de 2016 C. Morgan
Para substituir uma única vez, use:
Para substituir várias vezes, use:
29 de mai. de 2019 Indrajeet Singh
9 de mai. de 2019 jessie tessie
Confira esta resposta que poderá ajudar e usei no meu projeto.
30 de mai. de 2019 Raghavendra S
7 de jan. de 2014 Antonio Mirarchi
26 de fev. de 2019 Rinold
Todas as respostas são aceitas, você pode fazer isso de várias maneiras. Um dos truques para fazer isso é isso.
20 de mai. de 2019 Nouman Dilshad
Solução mais simples -
9 de fev. de 2019 Brijesh Kumar
Melhor solução, a fim de substituir qualquer caractere que usamos essas funções indexOf(), includes(), substring() para substituir matched String pelo provided String na string atual.
String.indexOf() function é encontrar o nname__º posição do índice de correspondência.
String.includes() método determina se uma string pode ser encontrada dentro de outra string, retornando true ou false conforme apropriado.
String.substring() function é para obter as partes de String (precedingname __, excedingname__). Adicionado o substituir String entre essas partes para gerar a string de retorno final.
A seguinte função permite usar qualquer caractere.
onde como RegExpNAME_ não permitirá algum caracter especial como ** e algum caractere precisa ser escape como $.
Também podemos usar o objeto de expressão regular para correspondência de texto com um padrão. A seguir estão as funções que serão objeto de expressão regular.
Você receberá SyntaxError quando estiver usando um padrão de expressão regular inválido, como '**'.
String.replace() function é usado para substituir a String especificada pela String fornecida.
String.match() function é descobrir quantas vezes a String é repetida.
RegExp.prototype.test method executa uma busca por uma correspondência entre uma expressão regular e uma string especificada. Retorna verdadeiro ou falso.
Observe que expressões regulares são escritas sem aspas.
Exemplos para usar funtions acima:
7 de fev. de 2019 Yash
Método mais rápido para substituir todas as instâncias de um caractere em uma string
JavaScript: substitui a última ocorrência de texto em uma string
Regex Javascript obter uma matriz de todas as correspondências, não apenas a primeira ocorrência
Como faço para substituir um caractere em um determinado índice em JavaScript?
Java como substituir 2 ou mais espaços com espaço único em string e excluir espaços iniciais e finais