¿Cuál es la diferencia entre java.lang.String replace()
y los replaceAll()
métodos, aparte de los usos posteriores de regex? Para sustituciones simples como, reemplazar .
con /
, ¿hay alguna diferencia?
221
En java.lang.String
, el replace
método 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 replace
método reemplazará todas las apariciones de un char o CharSequence
. Por otro lado, ambos String
argumentos replaceFirst
y replaceAll
son expresiones regulares (regex). Usar la función incorrecta puede provocar errores sutiles.
str.replaceAll(regex, repl)
es igual aPattern.compile(regex).matcher(str).replaceAll(repl)
. Entonces, hay una gran sobrecarga dependiendo de cuánto se use.String#replace(target, replacement)
hace lo mismo, excepto que cita las cadenas:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
¿Hay alguna razón por laString#replace
que sería más rápido queString#replaceAll
? No lo parecería, ya queString#replace
solo realiza operaciones adicionales.replaceAll
? La respuesta es más sobrereplace
P: ¿Cuál es la diferencia entre los
java.lang.String
métodosreplace()
yreplaceAll()
, aparte de eso, 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)fuente
CharSequence
es. Ambosreplace()
yreplaceAll()
"trabajar conCharSequence
". Es quereplaceAll()
considera lo dadoCharSequence
como una expresión regular, por lo que busca coincidencias de expresiones regulares , mientras quereplace()
considera lo dadoCharSequence
como un texto de búsqueda simple, por lo que busca ocurrencias de él.Ambos
replace()
yreplaceAll()
reemplazar todas las ocurrencias en la cadena.Ejemplos
Siempre encuentro ejemplos útiles para entender las diferencias.
replace()
Úselo
replace()
si solo desea reemplazar algunoschar
con otroschar
o algunosString
con otrosString
(en realidadCharSequence
).Ejemplo 1
Reemplace todas las ocurrencias del personaje
x
cono
.Ejemplo 2
Reemplace todas las ocurrencias de la cadena
fish
consheep
.replaceAll()
Úselo
replaceAll()
si desea utilizar un patrón de expresión regular .Ejemplo 3
Reemplace cualquier número con un
x
.Ejemplo 4
Eliminar todos los espacios en blanco.
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
fuente
El
replace()
método se sobrecarga para aceptar tanto un primitivochar
como unCharSequence
argumento.Ahora, en lo que respecta al rendimiento, el
replace()
método es un poco más rápido quereplaceAll()
porque este último compila primero el patrón regex y luego coincide antes de finalmente reemplazarlo, mientras que el primero simplemente coincide con el argumento proporcionado y reemplaza.Ya que sabemos que la coincidencia de patrones de expresiones regulares es un poco más complejo y por lo tanto más lento, a continuación, prefiriendo
replace()
másreplaceAll()
se sugiere siempre que sea posible.Por ejemplo, para sustituciones simples como usted mencionó, es mejor usar:
en vez de:
Nota: los argumentos del método de conversión anteriores dependen del sistema.
fuente
Pattern.compile(...)
contenido / parte en sus implementaciones, parece quereplace
es menos complejo sobre cómo definir / enviar el primer argumento. No requiere"\"
. Ademásreplace
está disponible desde Java1.5
yreplaceAll
desde1.4
Devuelve una nueva cadena resultante de reemplazar todas las apariciones de oldChar en esta cadena con newChar.
Reemplaza cada subcadena de esta cadena que coincide con la expresión regular dada con el reemplazo dado.
fuente
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 aparición en la cadena, use 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:
fuente
replace
no llamaPattern.compile(regex).matcher(this).replaceAll(replacement);
. LlamaPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Como se aludió en la respuesta de wickeD, con replaceAll la cadena de reemplazo se maneja de manera diferente entre replace y replaceAll. Esperaba que un [3] y un [4] tuvieran el mismo valor, pero son diferentes.
El resultado de esto es:
Esto es diferente de perl donde el reemplazo no requiere el nivel adicional de escape:
que imprime \ X 2
Esto puede ser bastante molesto, como cuando se trata de usar el valor devuelto por java.sql.DatabaseMetaData.getSearchStringEscape () con replaceAll ().
fuente
Hilo antiguo que conozco, pero soy algo nuevo en Java y descubro una de sus cosas extrañas. Lo he usado
String.replaceAll()
pero obtengo resultados impredecibles.Algo así desordena la cadena:
Así que diseñé esta función para solucionar el extraño problema:
Lo que te permite hacer:
fuente
String.replaceAll()
espera expresiones regulares, no argumentos literales, por lo que obtienes resultados "impredecibles" (que en realidad son muy predecibles).String.replace()
funciona de la manera que quieras.Para agregar a la "Mejor respuesta" ya seleccionada (y otras que son tan buenas como la de Suragch),
String.replace()
se limita al reemplazar los caracteres que son secuenciales (tomando asíCharSequence
). Sin embargo,String.replaceAll()
no está limitado al reemplazar solo caracteres secuenciales. Puede reemplazar los caracteres no secuenciales, siempre y cuando su expresión regular se construya de esa manera.Además (lo más importante y dolorosamente obvio),
replace()
solo puede reemplazar los valores literales; mientras quereplaceAll
puede reemplazar secuencias 'similares' (no necesariamente idénticas).fuente
replace()
el método no usa el patrón regex, mientras que elreplaceAll()
método usa el patrón regex. Por lo tanto,replace()
realiza más rápido quereplaceAll()
.fuente
replace funciona en el tipo de datos char pero replaceAll funciona en el tipo de datos String y ambos reemplazan todas las apariciones del primer argumento con el segundo argumento.
fuente