2012-12-26 9 views
5

Ho una stringa Java che possono contenere "{" e "}" coppie, più volte, all'interno di una stringa più grande:Come rimuovere le parentesi graffe nella stringa Java?

"My name is {name}. I am a {animal}. I like to {activity} whenever it rains." 

ecc Sto cercando di scrivere codice che striscia fuori tutte le istanze di queste coppie:

"My name is . I am a . I like to whenever it rains." 

queste coppie possono verificarsi ovunque all'interno della stringa, e possono non verificarsi affatto. Ovviamente un String#replaceAll(someRegex, "") è in ordine qui, ma io non riesco a ottenere il someRegex destra:

// My best attempt. 
String stripped = toStrip.replaceAll("{*}", ""); 

Tutte le idee? Grazie in anticipo.

+0

Cosa hai fino ad ora? Non è così difficile. Dovresti fare un tentativo. –

+0

@RohitJain: consultare il mio aggiornamento per il tentativo migliore (non riuscito). –

+0

probabilmente bisogno di usare * al posto di *, dato che è un regexp – njzk2

risposta

9

Per corrispondere a {, è necessario scappare. Come ha qualche significato speciale nella regex. Quindi, è necessario \\{ e \\}. Oppure puoi anche racchiuderli in una classe di caratteri.

E quindi per abbinare qualsiasi cosa tra loro, è possibile utilizzare .*. A dot (.) corrisponde a qualsiasi carattere. E * è un quantificatore, ovvero corrisponde a 0 or more.

Così, il vostro regex sarebbe: -

\\{.*?\\} 

o: -

[{].*?[}] 

Si noti che, ho usato un quantificatore riluttante lì - .*?. Nota il ? alla fine. È usato per abbinare fino al primo } in questo caso. Se si utilizza .* anziché .*?, la propria espressione regolare coprirà la stringa completa dal primo { fino all'ultimo } e sostituirà tutto.

Inoltre, uno speciale regex meta-caratteri, non ha significato speciale se utilizzato all'interno di un character class - quella cosa []. Questo è il motivo per cui non devi scappare da loro quando lo usi in quel modo. Da qui il 2 ° Regex.

Sembra piuttosto semplice, vero? Ok, ora è il momento di passare attraverso alcuni tutorial per saperne di più su Regular Expression. Si può iniziare con http://www.regular-expressions.info/tutorial.html

+0

bella spiegazione approfondita. – Lucas

+0

In genere non è necessario eseguire l'escape '{}' nelle espressioni regolari a meno che non contengano cifre. Ecco alcuni esempi: http://regex101.com/r/xR8yU3 –

+0

@Lindrian. Bene, hai ragione. In qualche luogo, io stesso sentivo che non c'è bisogno di sfuggirli. A volte mi confondo con quello. Ecco perché preferisco usare 'Classe personaggio 'con caratteri speciali. –

0

replaceAll("\\{.*?\\}", "") dovrebbe fare il lavoro

String stripped = "My name is {name}. I am a {animal}. I like to {activity} whenever it rains.".replaceAll("\\{.*?\\}", ""); 
System.out.println(stripped); 

stampe My name is . I am a . I like to whenever it rains.

1

provare a utilizzare più semplice espressione regolare \{\w*\} come di seguito:

String s = "My name is {name}. I am a {animal}. I like to {activity} "+ 
       "whenever it rains."; 
    System.out.println(s.replaceAll("\\{\\w*\\}", "")); 

Le strisce regex sopra i caratteri alfanumerici racchiudevano in {}. Se si desidera includere determinati caratteri speciali, includerli insieme allo \w menzionato all'interno delle parentesi.