Quelle est la différence entre les méthodes replace()
et les replaceAll()
méthodes de java.lang.String , autres que l'utilisation ultérieure de regex? Pour les substitutions simples comme, remplacer .
par /
, y a-t-il une différence?
221
str.replaceAll(regex, repl)
est identique àPattern.compile(regex).matcher(str).replaceAll(repl)
. Il y a donc un gros frais généraux en fonction de la quantité utilisée.String#replace(target, replacement)
fait la même chose, sauf qu'il cite les chaînes:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
y a-t-il une raison pour laquelle ceString#replace
serait plus rapide queString#replaceAll
? Il ne semblerait pas qu'il en soit ainsi puisqu'ilString#replace
effectue simplement des opérations supplémentaires.replaceAll
. La réponse est plus surreplace
Q: Quelle est la différence entre les
java.lang.String
méthodesreplace()
etreplaceAll()
, à part cela, la dernière utilise regex.R: Juste l'expression régulière. Ils remplacent tous les deux :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
Il y a aussi un
replaceFirst()
(qui prend une expression régulière)la source
CharSequence
est. Les deuxreplace()
etreplaceAll()
"travailler avecCharSequence
". C'est quireplaceAll()
considère le donnéCharSequence
comme une expression régulière afin qu'il recherche des correspondances d' expression régulière , tandis quereplace()
le donnéCharSequence
comme un texte de recherche simple afin qu'il en recherche les occurrences .Les deux
replace()
etreplaceAll()
remplacer toutes les occurrences dans la chaîne.Exemples
Je trouve toujours des exemples utiles pour comprendre les différences.
replace()
À utiliser
replace()
si vous voulez simplement en remplacer certainschar
par un autrechar
ou certainsString
par un autreString
(en faitCharSequence
).Exemple 1
Remplacez toutes les occurrences du personnage
x
paro
.Exemple 2
Remplacez toutes les occurrences de la chaîne
fish
parsheep
.replaceAll()
À utiliser
replaceAll()
si vous souhaitez utiliser un modèle d'expression régulière .Exemple 3
Remplacez n'importe quel nombre par un
x
.Exemple 4
Supprimez tous les espaces.
Voir également
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
la source
La
replace()
méthode est surchargée pour accepter à la fois une primitivechar
et uneCharSequence
comme arguments.Maintenant, en ce qui concerne les performances, la
replace()
méthode est un peu plus rapide quereplaceAll()
parce ce dernier compile d'abord le modèle d'expression régulière, puis correspond avant de finalement remplacer, tandis que le premier correspond simplement à l'argument fourni et le remplace.Puisque nous savons que la correspondance de motif regex est un peu plus complexe et , par conséquent plus lent, puis préférant
replace()
plusreplaceAll()
est suggéré chaque fois que possible.Par exemple, pour des substitutions simples comme vous l'avez mentionné, il est préférable d'utiliser:
au lieu de:
Remarque: les arguments de la méthode de conversion ci-dessus dépendent du système.
la source
Pattern.compile(...)
contenu / la partie dans leurs implémentations, semblereplace
moins complexe sur la façon de définir / envoyer le premier argument. Cela ne nécessite pas"\"
. De plusreplace
est disponible depuis Java1.5
etreplaceAll
depuis1.4
Renvoie une nouvelle chaîne résultant du remplacement de toutes les occurrences de oldChar dans cette chaîne par newChar.
Remplace chaque sous-chaîne de cette chaîne qui correspond à l'expression régulière donnée par le remplacement donné.
la source
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 (). Lorsque vous souhaitez remplacer une sous-chaîne par une autre sous-chaîne, quel que soit son lieu d'occurrence dans la chaîne, utilisez replace (). Mais si vous avez une préférence ou une condition particulière comme remplacer uniquement ces sous-chaînes au début ou à la fin d'une chaîne, utilisez replaceAll (). Voici quelques exemples pour prouver mon point:
la source
replace
n'appelle pasPattern.compile(regex).matcher(this).replaceAll(replacement);
. Il appellePattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Comme mentionné dans la réponse de wickeD, avec replaceAll, la chaîne de remplacement est traitée différemment entre replace et replaceAll. Je m'attendais à ce qu'un [3] et un [4] aient la même valeur, mais ils sont différents.
La sortie de ceci est:
Ceci est différent de perl où le remplacement ne nécessite pas le niveau supplémentaire d'échappement:
qui imprime \ X 2
Cela peut être assez gênant, comme lorsque vous essayez d'utiliser la valeur renvoyée par java.sql.DatabaseMetaData.getSearchStringEscape () avec replaceAll ().
la source
Vieux fil que je connais mais je suis un peu nouveau pour Java et découvre 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 chaîne:
J'ai donc conçu cette fonction pour contourner l'étrange problème:
Ce qui vous permet de faire:
la source
String.replaceAll()
attend des expressions régulières et non des arguments littéraux, c'est pourquoi vous obtenez des résultats "imprévisibles" (qui sont vraiment très prévisibles).String.replace()
fonctionne comme vous le souhaitez.Ajouter à la "meilleure réponse" déjà sélectionnée (et à d'autres qui sont tout aussi bonnes que celle de Suragch),
String.replace()
est contraint en remplaçant les caractères qui sont séquentiels (prenant ainsiCharSequence
). Cependant,String.replaceAll()
n'est pas contraint en remplaçant uniquement les caractères séquentiels. Vous pouvez remplacer les caractères non séquentiels aussi longtemps que votre expression régulière est construite de cette manière.De plus (le plus important et le plus douloureusement évident),
replace()
ne peut que remplacer les valeurs littérales; tandis quereplaceAll
peut remplacer des séquences «similaires» (pas nécessairement identiques).la source
replace()
la méthode n'utilise pas de motif regex alors que lareplaceAll()
méthode utilise le motif regex. Effectue doncreplace()
plus rapidement quereplaceAll()
.la source
replace fonctionne sur le type de données char mais replaceAll fonctionne sur le type de données String et les deux remplacent toutes les occurrences du premier argument par le deuxième argument.
la source