Por favor, deixe postagens claras que as pessoas possam entender. Eu editei este para você também. Você deve ter especificado um idioma pelo menos aqui.
GEOCHET
Claro, ele nunca é substituído ... é sempre uma nova string contendo o original com o texto substituído. Isso ocorre porque as strings são imutáveis.
Pablo Marambio
Tentei o método `String.Replace ()`. mas substitui todos os "AA" por "XQ"
string str ="The brown brown fox jumps over the lazy dog";
str =ReplaceFirst(str,"brown","quick");
EDIT : Como @itsmatt mencionou , há também Regex.Replace (String, String, Int32), que pode fazer o mesmo, mas provavelmente é mais caro em tempo de execução, já que está utilizando um analisador completo onde meu método faz um find e três strings concatenações.
EDIT2 : Se esta é uma tarefa comum, você pode querer tornar o método um método de extensão:
publicstaticclassStringExtension{publicstaticstringReplaceFirst(thisstring text,string search,string replace){// ...same as above...}}
Usando o exemplo acima, agora é possível escrever:
Interessante, você testou sua suposição sobre a abordagem de regex ser mais cara em tempo de execução? Que tal velocidade? Talvez a pesquisa usando Regex seja mais rápida do que usando IndexOf?
mfloryan
Eu meio que prefiro a resposta de @BilltheLizard envolvendo Remove () e Insert () a esta abordagem envolvendo Substring (). Existe alguma base para dizer que um é melhor do que o outro?
JohnC de
3
Cuidado: isso não funciona corretamente com Unicode combinando caracteres ou ligaduras. Por exemplo, ReplaceFirst("oef", "œ", "i")retorna incorretamente "ief" em vez de "if". Veja esta pergunta para mais informações.
Michael Liu
2
ReSharper avisa String.IndexOf is culture specific.. Mais robusto para atualizar int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango
64
Como itsmatt disse, Regex.Replace é uma boa escolha para isso, porém, para tornar sua resposta mais completa, vou preenchê-la com um exemplo de código:
using System.Text.RegularExpressions;...Regex regex =newRegex("foo");string result = regex.Replace("foo1 foo2 foo3 foo4","bar",1);// result = "bar1 foo2 foo3 foo4"
O terceiro parâmetro, definido como 1 neste caso, é o número de ocorrências do padrão regex que você deseja substituir na string de entrada desde o início da string.
Eu esperava que isso pudesse ser feito com uma sobrecarga estática de Regex.Replace, mas, infelizmente, parece que você precisa de uma instância de Regex para fazer isso.
Uma das sobrecargas de Regex.Replaceleva um intpara "O número máximo de vezes que a substituição pode ocorrer". Obviamente, usar Regex.Replacepara substituição de texto simples pode parecer um exagero, mas certamente é conciso:
Respostas:
Exemplo:
EDIT : Como @itsmatt mencionou , há também Regex.Replace (String, String, Int32), que pode fazer o mesmo, mas provavelmente é mais caro em tempo de execução, já que está utilizando um analisador completo onde meu método faz um find e três strings concatenações.
EDIT2 : Se esta é uma tarefa comum, você pode querer tornar o método um método de extensão:
Usando o exemplo acima, agora é possível escrever:
fonte
ReplaceFirst("oef", "œ", "i")
retorna incorretamente "ief" em vez de "if". Veja esta pergunta para mais informações.String.IndexOf is culture specific.
. Mais robusto para atualizarint pos = text.IndexOf(search, StringComparison.Ordinal);
.Como itsmatt disse, Regex.Replace é uma boa escolha para isso, porém, para tornar sua resposta mais completa, vou preenchê-la com um exemplo de código:
O terceiro parâmetro, definido como 1 neste caso, é o número de ocorrências do padrão regex que você deseja substituir na string de entrada desde o início da string.
Eu esperava que isso pudesse ser feito com uma sobrecarga estática de Regex.Replace, mas, infelizmente, parece que você precisa de uma instância de Regex para fazer isso.
fonte
"foo"
, mas você vai querer umnew Regex(Regex.Escape("foo"))
para o figurativo"foo"
.Dê uma olhada em Regex.Replace .
fonte
Levando o "primeiro apenas" em consideração, talvez:
?
Ou mais geralmente:
Então:
fonte
irá encontrar primeiro
F
emInputString
e substituí-lo porR
.fonte
result = (New Regex("F")).Replace(InputString, "R", 1)
Método de extensão C # que fará isso:
Aproveitar
fonte
Na sintaxe C #:
fonte
E porque também há VB.NET a considerar, eu gostaria de oferecer:
fonte
Presume que
AA
só precisa ser substituído se estiver no início da string:Se você precisar substituir a primeira ocorrência de
AA
, quer a string comece com ele ou não, vá com a solução de Marc.fonte
Uma das sobrecargas de
Regex.Replace
leva umint
para "O número máximo de vezes que a substituição pode ocorrer". Obviamente, usarRegex.Replace
para substituição de texto simples pode parecer um exagero, mas certamente é conciso:fonte
Para quem não se importa com uma referência
Microsoft.VisualBasic
, existe oReplace
Método :fonte
Este exemplo abstrai as substrings (mas é mais lento), mas provavelmente é muito mais rápido do que um RegEx:
fonte
fonte