Qual é a diferença entre java.lang.String replace()
e replaceAll()
métodos, além de usar regex? Para substituições simples como, substitua .
por /
, há alguma diferença?
221
Em java.lang.String
, o replace
método pega um par de caracteres ou um par de CharSequence
's (dos quais String é uma subclasse, portanto, é necessário um par de String). O replace
método substituirá todas as ocorrências de um caractere ou CharSequence
. Por outro lado, ambos os String
argumentos replaceFirst
e replaceAll
são expressões regulares (regex). Usar a função errada pode levar a erros sutis.
str.replaceAll(regex, repl)
é igual aPattern.compile(regex).matcher(str).replaceAll(repl)
. Portanto, existe uma grande sobrecarga, dependendo de quanto é usado.String#replace(target, replacement)
faz a mesma coisa, exceto que cita as strings:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
existe alguma razão pela qualString#replace
seria mais rápido do queString#replaceAll
? Parece que não, poisString#replace
apenas realiza operações adicionais.replaceAll
. A resposta é mais sobrereplace
P: Qual a diferença entre os
java.lang.String
métodosreplace()
ereplaceAll()
, além disso, o último usa regex.A: Apenas o regex. Ambos substituem todos :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
Há também um
replaceFirst()
(que usa uma regex)fonte
CharSequence
é. Ambosreplace()
ereplaceAll()
"trabalham comCharSequence
". É quereplaceAll()
considera o dadoCharSequence
como uma expressão regular para procurar correspondências de expressões regulares , enquantoreplace()
considera o dadoCharSequence
como um texto de pesquisa simples para procurar ocorrências dele.Ambos
replace()
ereplaceAll()
substituem todas as ocorrências na String.Exemplos
Eu sempre acho exemplos úteis para entender as diferenças.
replace()
Use
replace()
se você quiser substituir algunschar
por outrochar
ou outrosString
por outroString
(na verdadeCharSequence
).Exemplo 1
Substitua todas as ocorrências do personagem
x
poro
.Exemplo 2
Substitua todas as ocorrências da sequência
fish
porsheep
.replaceAll()
Use
replaceAll()
se você quiser usar um padrão de expressão regular .Exemplo 3
Substitua qualquer número por um
x
.Exemplo 4
Remova todo o espaço em branco.
Veja também
Documentação
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Expressões regulares
fonte
O
replace()
método está sobrecarregado para aceitar argumentos primitivochar
e aCharSequence
as.Agora, no que diz respeito ao desempenho, o
replace()
método é um pouco mais rápido do quereplaceAll()
porque o último primeiro compila o padrão regex e, em seguida, corresponde antes de finalmente substituir, enquanto o anterior simplesmente corresponde ao argumento fornecido e substitui.Como sabemos que a correspondência do padrão regex é um pouco mais complexa e, consequentemente, mais lenta, a preferência pelo
replace()
excessoreplaceAll()
é sugerida sempre que possível.Por exemplo, para substituições simples como você mencionou, é melhor usar:
ao invés de:
Nota: os argumentos do método de conversão acima dependem do sistema.
fonte
Pattern.compile(...)
conteúdo / parte em suas implementações, parecereplace
ser menos complexo sobre como definir / enviar o primeiro argumento. Não requer"\"
. Além disso,replace
está disponível desde Java1.5
ereplaceAll
desde1.4
Retorna uma nova string resultante da substituição de todas as ocorrências de oldChar nessa string por newChar.
Substitui cada substring dessa string que corresponde à expressão regular especificada pela substituição especificada.
fonte
Não é verdade que replace () funciona mais rápido que replaceAll (), pois ambos usam o mesmo código em sua implementação
Pattern.compile (regex) .matcher (this) .replaceAll (substituição);
Agora, a questão é quando usar replace e quando usar replaceAll (). Quando você deseja substituir uma subcadeia por outra subcadeia, independentemente de seu local de ocorrência na cadeia, use replace (). Mas se você tiver alguma preferência ou condição específica, como substituir apenas as substrings no início ou no final de uma string, use replaceAll (). Aqui estão alguns exemplos para provar meu argumento:
fonte
replace
não ligaPattern.compile(regex).matcher(this).replaceAll(replacement);
. Ele chama #Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Conforme mencionado na resposta do wickeD, com replaceAll, a cadeia de substituição é tratada de maneira diferente entre replace e replaceAll. Eu esperava que um [3] e um [4] tivessem o mesmo valor, mas eles são diferentes.
A saída disso é:
Isso é diferente do perl, onde a substituição não requer o nível extra de escape:
que imprime \ X 2
Isso pode ser um incômodo, como ao tentar usar o valor retornado por java.sql.DatabaseMetaData.getSearchStringEscape () com replaceAll ().
fonte
Tópico antigo que conheço, mas sou um pouco novo em Java e descubro uma de suas coisas estranhas. Eu usei,
String.replaceAll()
mas obtive resultados imprevisíveis.Algo assim bagunça a corda:
Então, eu projetei essa função para contornar o estranho problema:
O que o torna capaz de fazer:
fonte
String.replaceAll()
espera expressões regulares, não argumentos literais, e é por isso que você obtém resultados "imprevisíveis" (que são realmente muito previsíveis).String.replace()
funciona da maneira que você deseja.Para adicionar à "Melhor resposta" já selecionada (e outras que são tão boas quanto as de Suragch), a
String.replace()
restrição é substituída pela substituição de caracteres que são seqüenciais (levando assimCharSequence
). No entanto,String.replaceAll()
não é restrito substituindo apenas caracteres seqüenciais. Você pode substituir caracteres não sequenciais, desde que sua expressão regular seja construída dessa maneira.Além disso (o mais importante e dolorosamente óbvio),
replace()
só pode substituir valores literais; Considerando quereplaceAll
pode substituir sequências 'like' (não necessariamente idênticas).fonte
replace()
O método não usa o padrão regex, enquanto oreplaceAll()
método usa o padrão regex. Entãoreplace()
executa mais rápido quereplaceAll()
.fonte
replace funciona no tipo de dados char, mas replaceAll funciona no tipo de dados String e ambos substituem todas as ocorrências do primeiro argumento pelo segundo argumento.
fonte