characters - multiple replace java
Diferencia entre String replace() y replaceAll() (10)
¿Cuál es la diferencia entre los métodos replace()
y replaceAll()
, aparte de los usos posteriores de replaceAll()
regulares? Para sustituciones simples como, reemplazar .
con /
, ¿hay alguna diferencia?
- Both replace () y replaceAll () aceptan dos argumentos y reemplazan todas las apariciones de la primera subcadena (primer argumento) en una cadena con la segunda subcadena (segundo argumento).
- replace () acepta un par de char o charsequence y replaceAll () acepta un par de expresiones regulares.
No es cierto que replace () funcione más rápido que replaceAll () ya que ambos usan el mismo código en su implementación
Pattern.compile (regex) .matcher (this) .replaceAll (reemplazo);
Ahora la pregunta es cuándo usar replace y cuándo usar replaceAll (). Cuando desee reemplazar una subcadena con otra subcadena, independientemente de su lugar de ocurrencia en la cadena, utilice replace (). Pero si tiene alguna preferencia o condición particular como reemplazar solo esas subcadenas al principio o al final de una cadena, use replaceAll (). Aquí hay algunos ejemplos para probar mi punto:
String str = new String("==qwerty==").replaceAll("^==", "?"); //str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); //str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); //str: "?qwerty?"
Both replace()
y replaceAll()
reemplazan todas las ocurrencias en String.
Ejemplos
Siempre encuentro ejemplos útiles para entender las diferencias.
replace()
Use replace()
si solo quiere reemplazar un char
con otro char
o un String
con otro String
(en realidad, CharSequence
).
Ejemplo 1
Reemplace todas las ocurrencias 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
Reemplazar todas las ocurrencias del fish
cuerda 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()
Utilice replaceAll()
si desea usar un patrón de expresión regular .
Ejemplo 3
Reemplace cualquier número con una 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
Eliminar 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()
- replaceAll()
-
replaceFirst(String regex, String replacement)
Expresiones regulares
Como se alude en la respuesta de wickeD, con replaceToall la cadena de reemplazo se maneja de manera diferente entre replace y replaceAll. Esperaba que [3] y [4] tuvieran el mismo valor, pero son diferentes.
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());
}
}
El resultado de esto es:
/ 1
X 1
/X 2
X 1
/X 2
Esto es diferente de Perl, donde el reemplazo no requiere el nivel extra de escape:
#!/bin/perl
$esc = "//";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "/n";
que imprime / X 2
Esto puede ser bastante molesto, como cuando se intenta usar el valor devuelto por java.sql.DatabaseMetaData.getSearchStringEscape () con replaceAll ().
El método replace()
está sobrecargado para aceptar tanto un char
primitivo como un CharSequence
como argumentos.
Ahora, en lo que respecta al rendimiento, el método replace()
es un poco más rápido que replaceAll()
porque este último primero compila el patrón regex y luego coincide antes de reemplazarlo por último, mientras que el primero simplemente coincide con el argumento proporcionado y reemplaza.
Como sabemos que la coincidencia del patrón de expresiones regulares es un poco más compleja y, por consiguiente, más lenta, se sugiere preferir replace()
por replaceAll()
siempre que sea posible.
Por ejemplo, para sustituciones simples como las mencionadas, es mejor usar:
replace(''.'', ''//');
en lugar de:
replaceAll("//.", "////");
Nota: los argumentos del método de conversión anterior dependen del sistema.
En java.lang.String
, el método de replace
toma un par de char o un par de CharSequence
(de los cuales String es una subclase, por lo que felizmente tomará un par de String). El método de reemplazo reemplazará todas las ocurrencias de un char o CharSequence
. Por otro lado, ambos argumentos de String
para replaceFirst
y replaceAll
son expresiones regulares (expresiones regulares). Usar la función incorrecta puede conducir a errores sutiles.
Viejo hilo lo sé pero soy algo nuevo en Java y descubro una de sus cosas extrañas. He usado String.replaceAll()
pero obtengo resultados impredecibles.
Algo así arruina la cadena:
sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");
Así que diseñé esta función para evitar el extraño problema:
//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;
}
Lo que te permite hacer:
sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );
replace works en el tipo de datos char pero replaceAll funciona en el tipo de datos String y ambos reemplazan todas las instancias del primer argumento con el segundo argumento.
replace()
método replace()
no usa el patrón regex mientras que el método replaceAll()
usa un patrón regex. Entonces replace()
funciona más rápido que replaceAll()
.
P: ¿Cuál es la diferencia entre los métodos java.lang.String
replace()
y replaceAll()
, salvo que el último usa regex.
A: solo la expresión regular. Ambos reemplazan a todos :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PD:
También hay un replaceFirst()
(que toma una expresión regular)
String replace(char oldChar, char newChar)
Devuelve una nueva cadena resultante de reemplazar todas las ocurrencias de oldChar en esta cadena con newChar.
String replaceAll(String regex, String replacement
Reemplaza cada subcadena de esta cadena que coincide con la expresión regular dada con el reemplazo dado.