web-dev-qa-db-fra.com

Différence entre String replace () et replaceAll ()

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?

198
Jijoy

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.

159
emilan

Q: Quelle est la différence entre les méthodes Java.lang.Stringreplace() 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)

82
paulsm4

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.

32
Surender Thakran

replace() et replaceAll() remplacent toutes les occurrences de la chaîne.

Exemples

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

Voir également

Documentation

Expressions régulières

31
Suragch
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é.

3
S. Rahul
  1. Replace () et replaceAll () acceptent deux arguments et remplacent toutes les occurrences de la première sous-chaîne (premier argument) d'une chaîne par la deuxième sous-chaîne (deuxième argument).
  2. replace () accepte une paire de caractères ou charsequence et replaceAll () accepte une paire de regex.
  3. 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?"
3
Aarya

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 ().

1
Keith Crews

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 );
0
Codebeat