2011-10-05 9 views
24

En el momento que estoy haciendomanera más eficiente de usar reemplazar varias palabras en una cadena

Ejemplo:

line.replaceAll(",","").replaceAll("cat","dog").replaceAll("football","rugby"); 

Creo que es horrible. No estoy seguro de una mejor manera de hacer esto? ¿Tal vez recorrer un hashmap?

EDIT:

por la eficiencia que significa mejor estilo de código y flexibilidad

+3

¿Tiene alguna pregunta sobre la eficacia del tiempo de ejecución? ¿Flexibilidad?Estilo de código? Por favor aclara – Mac

+2

También puede ser una cuestión de corrección, ya que los reemplazos realizados durante N pases pueden no ser equivalentes a la realización de reemplazos de N pares durante una sola pasada. – Xion

+2

Pregunta actualizada, pero buscando el código para ser mejor estilo y permitir la flexibilidad – Decrypter

Respuesta

4

Aparte de que el real vuelva a colocar se convierte internamente a un regex Creo que el enfoque está muy bien. Una implementación no regex se puede encontrar en StringUtils.replace(..).

Mirando qué alternativas podría haber, aún necesita algo para identificar pares de cadenas. Esto podría verse como:

MultiReplaceUtil.replaceAll{line, 
     {",", ""}, {"cat", "dog"}, {"football", "rugby"}}; 

o tal vez

MapReplaceUtil(String s, Map<String, String> replacementMap); 

o incluso

ArrayReplaceUtil(String s, String[] target, String[] replacement); 

ninguno de los cuales parece más intuitivo para mí en términos de codificación de la práctica.

20

Puede usar Matcher.appendReplacement()/appendTail() para crear funciones de búsqueda y reemplazo muy flexibles.

El ejemplo de la JavaDoc se parece a esto:

Pattern p = Pattern.compile("cat"); 
Matcher m = p.matcher("one cat two cats in the yard"); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(sb, "dog"); 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 

Ahora, dentro de ese bucle while usted puede decidir lo que es el texto de reemplazo y la base de que la información sobre el contenido real de ser emparejado.

Por ejemplo, usted podría utilizar el patrón (,|cat|football) para que coincida con ,, catofootball y decidir sobre la sustitución real basado en el partido real dentro del bucle.

Puede hacer construcciones aún más flexibles de esta manera, como reemplazar todos los números decimales por números hexadecimales u operaciones similares.

No es tan corta y sencilla por ejemplo el código, pero se puede construir métodos cortas y sencillas con él.

21

Esta funcionalidad ya está implementada en Commons Lang 's StringUtils clase.

StringUtils.replaceEach(String text, String[] searchList, String[] replacementList) 
+1

Creo que no está en la biblioteca estándar, sino en Apache Commons [enlace] (https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#replaceEach%28java.lang.String,%20java.lang.String [] ,% 20java.lang.String []% 29) – tkokasih

+0

Nueva versión sería el ['StrSubstitutor'] (https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/ commons/text/StrSubstitutor.html) de [Apache Commons Text] (https://commons.apache.org/proper/commons-text/). – Andreas

1

Para los amantes Scala:

"cat".r.replaceAllIn("one cat two cats in the yard", m => "dog") 

Con m incluso se puede parametrizar su reemplazo.

Cuestiones relacionadas