Diferencia entre reemplazar cadenas () y reemplazar todo ()

Resuelto Jijoy asked hace 12 años • 13 respuestas

¿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?

Jijoy avatar May 31 '12 12:05 Jijoy
Aceptado
  • En java.lang.String, el replacemétodo toma un par de caracteres o un par de CharSequence(que String está implementando, por lo que felizmente tomará un par de String). El replacemétodo reemplazará todas las apariciones de char o CharSequence.
  • Por otro lado, los primeros Stringargumentos de replaceFirsty replaceAllson 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.

emilan avatar May 31 '2012 05:05 emilan

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)

paulsm4 avatar May 31 '2012 05:05 paulsm4

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 charpor otros charo algunos Stringpor otros String(en realidad CharSequence).

Ejemplo 1

Reemplace todas las apariciones del carácter xcon 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 fishcon 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
Suragch avatar Nov 14 '2017 02:11 Suragch

El replace()método está sobrecargado para aceptar argumentos primitivos chary 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.

Surender Thakran avatar May 31 '2012 05:05 Surender Thakran