Diferencia entre reemplazar cadenas () y reemplazar todo ()
¿Cuál es la diferencia entre java.lang.String replace()
y replaceAll()
los métodos, aparte de que este último usa expresiones regulares? Para sustituciones simples como reemplazar .
con /
, ¿hay alguna diferencia?
- En
java.lang.String
, elreplace
método toma un par de caracteres o un par deCharSequence
(que String está implementando, por lo que felizmente tomará un par de String). Elreplace
método reemplazará todas las apariciones de char oCharSequence
. - Por otro lado, los primeros
String
argumentos dereplaceFirst
yreplaceAll
son expresiones regulares (regex).
El uso de una función incorrecta puede provocar errores sutiles.
Secciones relevantes de java.lang.String
:
String replace(char oldChar, char newChar)
Devuelve una nueva cadena resultante de reemplazar todas las apariciones de oldChar en esta cadena con newChar.String replace(CharSequence target, CharSequence replacement)
Reemplaza cada subcadena de esta cadena que coincide con la secuencia de destino literal con la secuencia de reemplazo literal especificada.String replaceAll(String regex, String replacement)
Reemplaza cada subcadena de esta cadena que coincide con la expresión regular dada con el reemplazo dado.String replaceFirst(String regex, String replacement)
Reemplaza la primera subcadena de esta cadena que coincide con la expresión regular dada con el reemplazo dado.
Sólo la expresión regular. Ambos reemplazan a todos :)
http://docs.oracle.com/javase/8/docs/api/java/lang/String.html
PD:
También hay un replaceFirst()
(que requiere una expresión regular)
Ambos replace()
y replaceAll()
reemplazan todas las apariciones en la cadena.
Ejemplos
Siempre encuentro ejemplos útiles para comprender las diferencias.
replace()
Úselo replace()
si solo desea reemplazar algunos char
por otros char
o algunos String
por otros String
(en realidad CharSequence
).
Ejemplo 1
Reemplace todas las apariciones del carácter x
con 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_
Ejemplo 2
Reemplace todas las apariciones de la cadena fish
con 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()
Úselo replaceAll()
si desea utilizar un patrón de expresión regular .
Ejemplo 3
Reemplace cualquier número con un 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
Ejemplo 4
Elimina todos los espacios en blanco.
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
Ver también
Documentación
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Expresiones regulares
- Tutorial
- Lista de patrones
El replace()
método está sobrecargado para aceptar argumentos primitivos char
y a CharSequence
.
Ahora, en lo que respecta al rendimiento, el replace()
método es un poco más rápido replaceAll()
porque el último primero compila el patrón de expresiones regulares y luego lo compara antes de finalmente reemplazarlo, mientras que el primero simplemente coincide con el argumento proporcionado y lo reemplaza.
Como sabemos que la coincidencia de patrones de expresiones regulares es un poco más compleja y, en consecuencia, más lenta, se sugiere preferirla replace()
siempre replaceAll()
que sea posible.
Por ejemplo, para sustituciones simples como las que mencionaste, es mejor usar:
replace('.', '\\');
en lugar de:
replaceAll("\\.", "\\\\");
Nota: los argumentos del método de conversión anterior dependen del sistema.