Quelle est la différence entre les méthodes replace()
et replaceAll()
de Java.lang.String, autres que les utilisations ultérieures de regex? Pour des substitutions simples comme, remplacez .
par /
, existe-t-il une différence?
Dans Java.lang.String
, la méthode replace
prend soit une paire de caractères, soit une paire de CharSequence
(dont String est une sous-classe, elle prendra donc heureusement une paire de cordes). La méthode replace
remplacera toutes les occurrences d'un caractère ou CharSequence
. D'autre part, les deux arguments String
à replaceFirst
et replaceAll
sont des expressions régulières (regex). L'utilisation de la mauvaise fonction peut conduire à des bugs subtils.
Q: Quelle est la différence entre les méthodes Java.lang.String
replace()
et replaceAll()
, autre que celle utilisée ultérieurement par regex .
A: Juste la regex. Tous les deux remplacent tous :)
http://docs.Oracle.com/javase/6/docs/api/Java/lang/String.html
PS:
Il y a aussi un replaceFirst()
(qui prend une expression rationnelle)
La méthode replace()
est surchargée pour accepter à la fois une primitive char
et une CharSequence
comme arguments.
Maintenant, en ce qui concerne la performance, la méthode replace()
est un peu plus rapide que replaceAll()
car elle compile d'abord le motif regex, puis correspond avant de remplacer, alors que la dernière correspond simplement à l'argument fourni. remplace.
Puisque nous savons que la correspondance des motifs regex est un peu plus complexe et par conséquent plus lente, il est suggéré de préférer replace()
à replaceAll()
chaque fois que cela est possible.
Par exemple, pour les substitutions simples comme vous l'avez mentionné, il est préférable d'utiliser:
replace('.', '\\');
au lieu de:
replaceAll("\\.", "\\\\");
Remarque: les arguments de la méthode de conversion ci-dessus dépendent du système.
replace()
et replaceAll()
remplacent toutes les occurrences de la chaîne.
Je trouve toujours des exemples utiles pour comprendre les différences.
replace()
Utilisez replace()
si vous souhaitez simplement remplacer char
par un autre char
ou un certain String
par un autre String
(en fait CharSequence
).
Exemple 1
Remplacez toutes les occurrences du caractère x
par o
.
String myString = "__x___x___x_x____xx_";
char oldChar = 'x';
char newChar = 'o';
String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_
Exemple 2
Remplacez toutes les occurrences de la chaîne fish
par sheep
.
String myString = "one fish, two fish, three fish";
String target = "fish";
String replacement = "sheep";
String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep
replaceAll()
Utilisez replaceAll()
si vous souhaitez utiliser un motif d'expression régulière .
Exemple 3
Remplacez n'importe quel nombre par x
.
String myString = "__1_6____3__6_345____0";
String regex = "\\d";
String replacement = "x";
String newString = myString.replaceAll(regex, replacement);
// __x_x____x__x_xxx____x
Exemple 4
Supprimer tous les espaces.
String myString = " Horse Cow\n\n \r Camel \t\t Sheep \n Goat ";
String regex = "\\s";
String replacement = "";
String newString = myString.replaceAll(regex, replacement);
// HorseCowCamelSheepGoat
Documentation
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Expressions régulières
String replace(char oldChar, char newChar)
Retourne une nouvelle chaîne résultant du remplacement de newChar de toutes les occurrences de oldChar dans cette chaîne.
String replaceAll(String regex, String replacement
Remplace chaque sous-chaîne de cette chaîne qui correspond à l'expression régulière donnée par le remplacement donné.
Il n'est pas vrai que replace () fonctionne plus rapidement que replaceAll (), car les deux utilisent le même code dans son implémentation.
Pattern.compile (regex) .matcher (this) .replaceAll (remplacement);
Maintenant, la question est de savoir quand utiliser replace et quand utiliser replaceAll (). Si vous souhaitez remplacer une sous-chaîne par une autre, quel que soit son emplacement dans la chaîne, utilisez replace (). Mais si vous avez une préférence ou une condition particulière, comme remplacer uniquement les sous-chaînes au début ou à la fin d'une chaîne, utilisez replaceAll (). Voici quelques exemples pour prouver mon point:
String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"
Comme indiqué dans la réponse de wickeD, avec replaceAll, la chaîne de remplacement est gérée différemment entre replace et replaceAll. Je m'attendais à ce que [3] et un [4] aient la même valeur, mais ils sont différents.
public static void main(String[] args) {
String[] a = new String[5];
a[0] = "\\";
a[1] = "X";
a[2] = a[0] + a[1];
a[3] = a[1].replaceAll("X", a[0] + "X");
a[4] = a[1].replace("X", a[0] + "X");
for (String s : a) {
System.out.println(s + "\t" + s.length());
}
}
Le résultat de ceci est:
\ 1
X 1
\X 2
X 1
\X 2
Ceci est différent de Perl où le remplacement ne nécessite pas le niveau supplémentaire d'échappement:
#!/bin/Perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
qui imprime\X 2
Cela peut être très gênant, par exemple lorsque vous essayez d'utiliser la valeur renvoyée par Java.sql.DatabaseMetaData.getSearchStringEscape () avec replaceAll ().
Vieux fil que je connais mais je suis un peu nouveau pour Java et découvrir une de ses choses étranges. J'ai utilisé String.replaceAll()
mais j'obtiens des résultats imprévisibles.
Quelque chose comme ça gâche la ficelle:
sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");
J'ai donc conçu cette fonction pour résoudre ce problème étrange:
//String.replaceAll does not work OK, that's why this function is here
public String strReplace( String s1, String s2, String s )
{
if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
{ return s; }
while( (s != null) && (s.indexOf( s1 ) >= 0) )
{ s = s.replace( s1, s2 ); }
return s;
}
Ce qui vous permet de faire:
sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );