Eu tenho uma string chamada "olá mundo"
Preciso substituir a palavra "mundo" por "csharp"
para isso eu uso:
string.Replace("World", "csharp");
mas, como resultado, não substituo a string. A razão é a distinção entre maiúsculas e minúsculas. A string original contém "world", enquanto eu estou tentando substituir "World".
Existe alguma maneira de evitar essa distinção entre maiúsculas e minúsculas no método string.Replace?
Respostas:
Você pode usar um Regex e executar uma substituição que não diferencia maiúsculas de minúsculas:
fonte
hello. world?
ou qualquer outra coisa que contenha operadores de expressões regulares.O Regex.Escape é útil se você confiar na entrada do usuário que pode conter elementos de idioma do Regex
Atualizar
Graças aos comentários, você realmente não precisa escapar da string de substituição.
Aqui está um pequeno violino que testa o código :
Sua saída é:
fonte
Regex.Escape
é ruim, prefixará caracteres especiais com barras invertidas. Parece que a melhor maneira é .Replace ("$", "$$"), que é meio burro ( stackoverflow.com/a/10078353 ).Método 2.5X MAIS RÁPIDO e MAIS EFICAZ do que os métodos de expressões regulares de outros:
Nota: ignore case ==
StringComparison.OrdinalIgnoreCase
como parâmetro paraStringComparison comparisonType
. É a maneira mais rápida, sem distinção entre maiúsculas e minúsculas, de substituir todos os valores.Vantagens deste método:
newValue
comonull
), otimizada para isso;string.Replace
, mesmas exceções;À prova de benchmark : esta solução é 2,59 vezes mais rápida que o regex de @Steve B., código:
Ideia original - @ Darky711; obrigado @MinerR por
StringBuilder
.fonte
String
. No entanto, oStringBuilder
é realmente mais rápido em 30-40% do que oString
. Eu atualizei a solução. Obrigado;)As extensões facilitam nossa vida:
fonte
Muitas sugestões usando o Regex. Que tal esse método de extensão sem ele:
fonte
comparison
parâmetro deve ser usado emIndexOf
, em vez deStringComparison.CurrentCultureIgnoreCase
if(old.Equals(@new, comparison)) return @new;
uma vez que a nova string pode diferir em maiúsculas / minúsculas.Você pode usar o espaço para nome Microsoft.VisualBasic para encontrar esta função auxiliar:
fonte
( Editado: não estava ciente do problema do `link nu ', desculpe por isso)
Retirado daqui :
Parece que você não é o primeiro a reclamar da falta de sequência que não diferencia maiúsculas de minúsculas.
fonte
A resposta do @ Darky711 modificada para usar o tipo de comparação passado e corresponder à estrutura substitui os comentários de nomenclatura e xml o mais próximo possível.
fonte
Eu escrevi o método de extensão:
Eu uso dois métodos de extensão adicionais para o método de extensão anterior:
fonte
IsNot
está tomando extensões muito a sério :).IsNot
Estendendo a resposta de Petrucio com
Regex.Escape
na cadeia de busca e escapando do grupo correspondente, conforme sugerido na resposta de Steve B (e algumas pequenas alterações no meu gosto):O que produzirá os seguintes resultados esperados:
No entanto, sem executar as fugas, você obteria o seguinte, que não é um comportamento esperado de um
String.Replace
que não diferencia maiúsculas de minúsculas:fonte
Isso não funciona: não consigo imaginar algo mais rápido ou fácil.
fonte
A função abaixo é remover todas as palavras correspondentes (como esta) do conjunto de cadeias. Por Ravikant Sonare.
fonte
Usando a solução @Georgy Batalov, tive um problema ao usar o exemplo a seguir
string original = "blá, CD = bleh, CD = blih, CD = bloh, DC = com"; sequência substituída = original.ReplaceIgnoreCase (", DC =", ".")
Abaixo está como eu reescrevi sua extensão
fonte
abaixo é a alternativa para substituir a seqüência de caracteres ignorando caracteres
fonte
Você também pode tentar a
Regex
aula.var regex = new Regex( "camel", RegexOptions.IgnoreCase ); var newSentence = regex.Replace( sentence, "horse" );
fonte
Eu prefiro isso - "Olá Mundo" .ToLower (). Substitua ("mundo", "csharp");
fonte