¿Cómo eliminar caracteres especiales de una cadena?

90

Quiero eliminar caracteres especiales como:

- + ^ . : ,

desde un String usando Java.

Sameek Mishra
fuente
Aparentemente, ya sabe qué es una expresión regular en función de cómo ha etiquetado su pregunta. ¿Intentaste leer la documentación de la Stringclase? En particular, busque la palabra 'regex'; hay algunos métodos, y un poco de pensamiento debería decirle cómo proceder ... :)
Karl Knechtel
3
La frase "carácter especial" está tan sobreutilizada que casi no tiene sentido. Si lo que quiere decir es "Tengo esta lista de caracteres específicos que quiero eliminar", haga lo que sugiere Thomas y forme su patrón con una clase de caracteres regex y replaceAllelimínelos. Si tiene requisitos más esotéricos, edite la pregunta. :)
Ray Toal
1
esos no son caracteres especiales ... estos son: äâêíìéè ya que no son sus tipos de caracteres comunes de 1 byte como - + ^ son ... de todos modos, como dijo Ray, haga una replaceAllpara ellos, o haga un análisis en la cadena, agregue los caracteres que no son los caracteres que desea sacar a otra cadena y, al final, simplemente haga un + = en una cadena que devolverá.
Gonçalo Vieira
deleteChars.apply( fromString, "-+^.:," );- busque deleteChars aquí
Kaplan

Respuestas:

255

Eso depende de lo que defina como caracteres especiales, pero intente replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

Tenga en cuenta que el ^carácter no debe ser el primero en la lista, ya que entonces tendría que escapar de él o significaría "cualquiera excepto estos caracteres".

Otra nota: el -carácter debe ser el primero o el último en la lista, de lo contrario tendría que escapar de él o definiría un rango (por ejemplo :-,, significaría "todos los caracteres en el rango :hasta ,).

Por lo tanto, con el fin de mantener la coherencia y no depender de posicionamiento carácter, es posible que desee escapar de todos los caracteres que tienen un significado especial en las expresiones regulares (la siguiente lista no es completa, por lo que estar al tanto de otros personajes como (, {, $ etc.) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


Si desea deshacerse de todos los signos de puntuación y símbolos, pruebe esta expresión regular: \p{P}\p{S}(tenga en cuenta que en las cadenas de Java tendrá que escapar de las barras diagonales inversas :) "\\p{P}\\p{S}".

Una tercera forma podría ser algo como esto, si puede definir exactamente lo que debe quedar en su cadena:

String  result = yourString.replaceAll("[^\\w\\s]","");

Esto significa: reemplace todo lo que no sea un carácter de palabra (az en cualquier caso, 0-9 o _) o espacios en blanco.

Editar: tenga en cuenta que hay un par de otros patrones que pueden resultar útiles. Sin embargo, no puedo explicarlos todos, así que eche un vistazo a la sección de referencia de regular-expressions.info .

Aquí hay una alternativa menos restrictiva al enfoque de "definir caracteres permitidos", como lo sugiere Ray:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

La expresión regular coincide con todo lo que no sea una letra en ningún idioma y no un separador (espacios en blanco, salto de línea, etc.). Tenga en cuenta que no puede usar [\P{L}\P{Z}](la P mayúscula significa no tener esa propiedad), ya que eso significaría "todo lo que no sea una letra o un espacio en blanco", que casi coincide con todo, ya que las letras no son espacios en blanco y viceversa.

Información adicional sobre Unicode

Algunos caracteres Unicode parecen causar problemas debido a las diferentes formas posibles de codificarlos (como un único punto de código o una combinación de puntos de código). Consulte regular-expressions.info para obtener más información.

Thomas
fuente
+1 para la mejor solución de uso general. Dado que está enumerando un par de variaciones en ausencia de detalles del OP, también podría mostrar y explicar patrones como[\P{L}]
Ray Toal,
También tenga en cuenta que el -personaje debe ser el primero o el último en la lista o debe ser escapado.
kapex
[^\\p{L}\\p{Z}]parece eliminar las diéresis alemanas (ä, ö, ü) también (al menos lo hace para mí: /), por lo que "La expresión regular coincide con todo lo que no sea una letra en ningún idioma" no parece ser 100% correcto
Peter
@Peter no elimina esos personajes en mis pruebas. Puede haber otro problema en su caso, por ejemplo, una codificación diferente del texto. Agregaré un enlace para obtener más información.
Thomas
1
@Thomas String result = yourString.replaceAll("[^\w\s]","");comete un errorInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth
40

Esto reemplazará todos los caracteres excepto los alfanuméricos

replaceAll("[^A-Za-z0-9]","");
Stephen
fuente
Esto también eliminará los caracteres árabes.
S0haib Nasir
1
Esta es la mejor respuesta.
Marius Razvan Varvarei
18

Como se describe aquí http://developer.android.com/reference/java/util/regex/Pattern.html

Los patrones son expresiones regulares compiladas. En muchos casos, los métodos de conveniencia como String.matches, String.replaceAlly String.splitserán preferibles, pero si necesita hacer mucho trabajo con la misma expresión regular, puede ser más eficiente compilarlo una vez y reutilizarlo. La clase Pattern y su compañera, Matcher, también ofrecen más funcionalidad que la pequeña cantidad expuesta por String.

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

Resultado

String is = one
Number is = 9196390097
turbandroide
fuente
Esto eliminará los caracteres árabes
S0haib Nasir
15

Prueba el replaceAll()método de la Stringclase.

Por cierto, aquí está el método, el tipo de retorno y los parámetros.

public String replaceAll(String regex,
                         String replacement)

Ejemplo:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

¡Debería eliminar todos los caracteres {'^', '+', '-'} que deseaba eliminar!

omt66
fuente
6

Para quitar carácter especial

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

La salida será: abdd.

Esto funciona perfectamente.

Akila
fuente
1
obtendrá un carácter de escape ilegal en literal de cadena
John Joe
Esto también eliminará los espacios si desea mantener los espacios, luego use t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan
2

Utilice el String.replaceAll()método en Java. replaceAll debería ser lo suficientemente bueno para su problema.

MONTE.
fuente
1

Puede eliminar un solo carácter de la siguiente manera:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

SALIDA:

919595354336
Satya
fuente
0

Si solo desea hacer un reemplazo literal en Java, use Pattern.quote(string)para escapar cualquier cadena a un literal.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Tezra
fuente