2011-03-21 43 views
13

Estoy pensando en usar String.replaceAll() para eliminar ciertos caracteres en mi cadena. No está claro qué caracteres se eliminarán (es decir, qué caracteres quiero eliminar), pero supongo que cualquier carácter es válido (como [a-zA-Z] y cosas como $%!, etc.).Eliminar ciertos caracteres de una cadena

me encontré con http://www.java-tips.org/java-se-tips/java.lang/strip-certain-characters-from-a-string.html pero seguro que hay una manera mejor que iterar sobre cada personaje ...

Alguna idea sobre esto?

Gracias

Ejemplo:

Solo para aclarar, voy a tener cadenas de diferentes longitudes. Quiero quitarle los caracteres, los exactos a determinar en tiempo de ejecución, y devolver la cadena resultante.

Tomando el párrafo anterior y que me permite retirar de él la ",.", me devuelve la cadena:

Solo para aclarar voy a tener cadenas de longitudes variables que se quieren eliminar caracteres de ella los exactos a pueden determinar en tiempo de ejecución y volver la cadena resultante

Como acotación al margen, sé que replaceAll() utiliza expresiones regulares, así que si quería que se deben eliminar las caracterís rs "$ ,.", necesitaría escapar de ellos también, ¿verdad?

+1

¿Cómo es claro qué replaceAll se retire? – CromTheDestroyer

+0

lo siento, no está claro qué caracteres quiero quitar, no cuáles eliminará All() reemplazará. – ekawas

+0

¿Desea eliminar ciertos caracteres de una cadena, pero no está seguro de cuáles? – Gabe

Respuesta

13

supongo, el código de abajo le ayudará.

String input = "Just to clarify, I will have strings of varying " 
     + "lengths. I want to strip characters from it, the exact " 
     + "ones to be determined at runtime, and return the " 
     + "resulting string."; 
    String regx = ",."; 
    char[] ca = regx.toCharArray(); 
    for (char c : ca) { 
     input = input.replace(""+c, ""); 
    } 
    System.out.println(input); 
+1

Definitivamente una penalización de rendimiento en este caso. Yo prefiero el enfoque de 'StringBuilder' tomada personalmente por debajo – John

16

Es posible que desee comenzar especificando el carácter que desea guardar, intente algo como:

"mystring".replaceAll("[^a-zA-Z]", "")​ 

Para mantener sólo letras.

+0

Esta solución funciona si sólo quería cartas ... – ekawas

0

Supongo que el código de ejemplo en su enlace es lo suficientemente bueno como para agregar otros caracteres válidos de su elección. Pero puedes minimizar el código usando expresiones regulares. Eche un vistazo al código de Abdullah, o vea más link1, link2, link3.

9

Este es uno de esos casos donde las expresiones regulares probablemente no sean una buena idea. Vas a terminar escribiendo más código especial para evitar expresiones regulares que si simplemente tomas el enfoque simple e iteras sobre los personajes. También corre el riesgo de pasar por alto algunos casos que podrían aparecer como un error más adelante.

Si le preocupa el rendimiento, la expresión regular realmente será mucho más lenta. Si mira el código o el perfil de su uso, regex tiene que crear un patrón para analizar/compilar, ejecutar la lógica de coincidencia y luego aplicar su reemplazo. Todo eso crea una gran cantidad de objetos, lo que puede ser costoso si repites esto con la frecuencia suficiente.

Implementaré lo que encontraste en ese enlace un poco diferente. Usted puede ahorrar en innecesarias String asignaciones a medida que construye el resultado sin ninguna complejidad adicional:

public static String stripChars(String input, String strip) { 
    StringBuilder result = new StringBuilder(); 
    for (char c : input.toCharArray()) { 
     if (strip.indexOf(c) == -1) { 
      result.append(c); 
     } 
    } 
    return result.toString(); 
} 
+0

Ok, John tiene una buena respuesta a evitar problemas de expresiones regulares. El método 'String.replace (target, replacement)' reemplaza cada subcadena de esta cadena que coincide con la secuencia objetivo literal con la secuencia de reemplazo literal especificada ". – WhiteFang34

1

creo que busca un código como este para resolver su problema without any looping:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StripChars { 
    public static void main(String[] args) { 
    // prints: Just to clarify I will have strings of varying lengths 
    System.out.println(
    replace("Just to clarify, I will have strings of varying lengths.", 
       ",.")); 

    // prints: Solution to my problem on Stackoverflow will cost me 0 
    System.out.println(
    replace("Solution to my problem on stackoverflow will cost me $0.", 
       ".$"));  
    } 

    static String replace(String line, String charsToBeReplaced) { 
     Pattern p = Pattern.compile("(.{1})"); 
     Matcher m = p.matcher(charsToBeReplaced); 
     return line.replaceAll(m.replaceAll("\\\\$1\\|"), ""); 
    } 
} 

Para cuidar de caracteres de expresiones regulares especiales (meta-caracteres) en la entrada de reemplazar método es primero poniendo \ (barra invertida) antes de cada carácter y a | (tubería) después de cada personaje en su entrada. Por lo tanto, una entrada de ",." se convertirá en "\\,|\\.|"

Una vez hecho esto, el reemplazo es bastante simple: por cada charo que coincida, reemplácelo por un espacio en blanco.

No

utilizado en esta solución, pero aquí es el patrón para detectar la presencia de CUALQUIER carácter especial de expresiones regulares en Java:

Pattern metachars = Pattern.compile(
    "^.*?(\\(|\\[|\\{|\\^|\\-|\\$|\\||\\]|\\}|\\)|\\?|\\*|\\+|\\.).*?$"); 
+0

¿podría enviar el ejemplo de trabajo completa – Deepak

+0

@Deepak: Editado para mostrar completamente de trabajo de la clase Java. – anubhava

9

Si ya está utilizando la biblioteca, guayaba hace fácil con CharMatcher

String charsToRemove = "%^#"; 
String stringToFilter = "I have 20% of my assets in #2 pencils! :^)"; 

String filtered = CharMatcher.anyOf(charsToRemove).removeFrom(stringToFilter); 
+0

se ve bien, pero ¿qué biblioteca? – trillions

+1

Guava: http://code.google.com/p/guava-libraries/ –

+0

gracias, lo vi en nuestra base de código. fácil de usar :) gracias ~ – trillions

1

creo que esto se puede hacer mediante el uso de expresiones regulares.

En primer lugar, sabemos [a-zA-Z] y $%! es válida para los caracteres en cadena. Entonces usamos regx "[^a-zA-Z0-9$%!]" para quitar los otros caracteres inválidos. cheque http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html para obtener información detallada de JAVA Patten.

A continuación, podemos utilizar mystring.replaceAll(String regex, String replacement)

P. S. RefexPlanet expresión de la prueba en línea regular Página

+0

Creo que esta debería ser la respuesta aceptada por qué reinventar la rueda! – ExistMe

Cuestiones relacionadas