Come rimuovere caratteri speciali da una stringa?


92

Voglio rimuovere caratteri speciali come:

- + ^ . : ,

da una stringa utilizzando Java.


Apparentemente sai già cos'è una regex in base a come hai taggato la tua domanda. Hai provato a leggere la documentazione per la Stringclasse? In particolare, cerca la parola "regex"; ci sono alcuni metodi e un po 'di riflessione dovrebbe dirti come procedere ... :)
Karl Knechtel

3
La frase "carattere speciale" è così abusata da essere quasi completamente priva di significato. Se quello che intendi è "Ho questo elenco di caratteri specifici che voglio rimuovere", fai come suggerisce Thomas e forma il tuo modello con una classe di caratteri regex e replaceAllvia. Se hai requisiti più esoterici, modifica la domanda. :)
Ray Toal

1
quelli non sono caratteri speciali ... questi sono: äâêíìéè poiché non sono i tuoi comuni tipi di caratteri a 1 byte come - + ^ sono ... comunque, come ha affermato Ray, o fai un replaceAllper loro, o fai un'analisi la stringa, aggiungi i caratteri che non sono i caratteri che vuoi estrarre a un'altra stringa e alla fine fai semplicemente un + = a una stringa che restituirai.
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );- trova deleteChars qui
Kaplan

Risposte:


258

Dipende da cosa definisci caratteri speciali, ma prova replaceAll(...):

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

Nota che il file ^ carattere non deve essere il primo dell'elenco, poiché dovresti quindi eseguire l'escape o significherebbe "qualsiasi tranne questi caratteri".

Un'altra nota: il -carattere deve essere il primo o l'ultimo della lista, altrimenti dovresti uscire da esso o definirebbe un intervallo (ad es. :-,Significherebbe "tutti i caratteri nell'intervallo da :a ,).

Così, al fine di mantenere la coerenza e non dipendere dal posizionamento di carattere, si potrebbe desiderare di fuggire tutti quei personaggi che hanno un significato speciale nelle espressioni regolari (la seguente lista non è completa, in modo da essere a conoscenza di altri personaggi come (, {, $ etc.) :

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


Se vuoi eliminare tutta la punteggiatura e i simboli, prova questa regex: \p{P}\p{S}(tieni presente che nelle stringhe Java dovresti sfuggire alle barre indietro:"\\p{P}\\p{S}" .

Un terzo modo potrebbe essere qualcosa del genere, se puoi definire esattamente cosa dovrebbe essere lasciato nella tua stringa:

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

Ciò significa: sostituire tutto ciò che non è un carattere di parola (az in ogni caso, 0-9 o _) o spazi bianchi.

Modifica: tieni presente che ci sono un paio di altri modelli che potrebbero rivelarsi utili. Tuttavia, non posso spiegarli tutti, quindi dai un'occhiata alla sezione di riferimento di regular-expressions.info .

Ecco un'alternativa meno restrittiva all'approccio "definire i caratteri consentiti", come suggerito da Ray:

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

L'espressione regolare corrisponde a tutto ciò che non è una lettera in qualsiasi lingua e non un separatore (spazi bianchi, interruzioni di riga ecc.). Nota che non puoi usare[\P{L}\P{Z}] (la P maiuscola significa non avere quella proprietà), poiché ciò significherebbe "tutto ciò che non è una lettera o non uno spazio", che corrisponde quasi a tutto, poiché le lettere non sono spazi e viceversa.

Ulteriori informazioni su Unicode

Alcuni caratteri Unicode sembrano causare problemi a causa di diversi modi possibili per codificarli (come un singolo punto di codice o una combinazione di punti di codice). Fare riferimento a regular-expressions.info per ulteriori informazioni.


+1 per la migliore soluzione generica. Dal momento che stai elencando un paio di variazioni in assenza di dettagli dall'OP, potresti anche mostrare e spiegare schemi come[\P{L}]
Ray Toal,

Nota inoltre che il -carattere deve essere il primo o l'ultimo nell'elenco o deve essere preceduto da un escape.
Kapex

[^\\p{L}\\p{Z}]sembra eliminare anche gli Umlaut tedeschi (ä, ö, ü) (almeno lo fa per me: /), quindi "L'espressione regolare corrisponde a tutto ciò che non è una lettera in qualsiasi lingua" non sembra essere corretto al 100%
Peter

@ Peter non elimina quei personaggi nei miei test. Potrebbe esserci un altro problema nel tuo caso, ad esempio una diversa codifica del testo. Aggiungerò un collegamento a ulteriori informazioni.
Thomas

1
@Thomas String result = yourString.replaceAll("[^\w\s]","");fa un erroreInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

Come descritto qui http://developer.android.com/reference/java/util/regex/Pattern.html

I pattern sono espressioni regolari compilate. In molti casi, i metodi di convenienza, come String.matches, String.replaceAlle String.splitsarà preferibile, ma se avete bisogno di fare un sacco di lavoro con la stessa espressione regolare, può essere più efficace per compilare una volta e riutilizzarlo. La classe Pattern e il suo compagno, Matcher, offrono anche più funzionalità rispetto alla piccola quantità esposta da 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;
 }
}

Risultato

String is = one
Number is = 9196390097

Questo rimuoverà i caratteri arabi
S0haib Nasir

15

Prova il replaceAll()metodo della Stringclasse.

A proposito, ecco il metodo, il tipo restituito ei parametri.

public String replaceAll(String regex,
                         String replacement)

Esempio:

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

Dovrebbe rimuovere tutti i caratteri {'^', '+', '-'} che volevi rimuovere!


6

Per rimuovere il carattere speciale

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

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

L'output sarà: abdd.

Funziona perfettamente.


1
otterrà un carattere di escape illegale in una stringa letterale
John Joe

Questo rimuoverà anche gli spazi se si desidera mantenere gli spazi, quindi utilizzare t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan

2

Usa il String.replaceAll()metodo in Java. replaceAll dovrebbe essere abbastanza buono per il tuo problema.


1

Puoi rimuovere un singolo carattere come segue:

String str="+919595354336";

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

 System.out.println(result);

PRODUZIONE:

919595354336

0

Se vuoi solo fare una sostituzione letterale in java, usa Pattern.quote(string)per eseguire l'escape di qualsiasi stringa in un letterale.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.