2013-04-02 12 views
6

Ho il seguente codice Java:Java espressione regolare per togliere tag XML, ma non tag contenuti

str = str.replaceAll("<.*?>.*?</.*?>|<.*?/>", ""); 

Questo trasforma una stringa in questo modo:

How now <fizz>brown</fizz> cow. 

Into:

How now cow. 

Tuttavia, desidero semplicemente rimuovere i tag <fizz> e </fizz> o solo standalone </fizz> e lascia il contenuto dell'elemento da solo. Quindi, una regex che avrebbe trasformato il sopra in:

How now brown cow. 

o, per usare una stringa più complessa, somethng che trasforma:

How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow. 

Into:

How now brown cow. 

Ho provato questo:

str = str.replaceAll("<.*?></.*?>|<.*?/>", ""); 

E ciò non lavorare affatto Qualche idea? Grazie in anticipo!

+0

di solito se i tag 'xml' e' regex' mostrano insieme, si otterrebbe un commento, si dice .... – Kent

+1

Hai provato a utilizzare un parser XML? Trovo la mia vita molto più semplice con JDOM per l'analisi di XML. –

+0

Non posso entrare nei dettagli senza cadere in un enorme backstory ma non è possibile qui (XML Parser). Sto solo cercando una soluzione regex. – IAmYourFaja

risposta

26
"How now <fizz>brown</fizz> cow.".replaceAll("<[^>]+>", "") 
+0

Molto efficiente e compatto. –

6

Eri quasi arrivato;)

Prova questo:

str = str.replaceAll("<.*?>", "") 
+0

L'ho provato con Notepad ++ e funzionava perfettamente. – Johnny

2

si può provare anche questo:

str = str.replaceAll("<.*?>", ""); 

Si prega di dare un'occhiata al l'esempio di seguito per una migliore comprensione:

public class StringUtils { 

    public static void main(String[] args) { 
     System.out.println(StringUtils.replaceAll("How now <fizz>brown</fizz> cow.")); 
     System.out.println(StringUtils.replaceAll("How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow.")); 
    } 

    public static String replaceAll(String strInput) { 
     return strInput.replaceAll("<.*?>", ""); 
    } 
} 

uscita:

How now brown cow. 
How now brown cow. 
+0

-1. Le parentesi angolari ('<' and '>') non hanno alcun significato speciale nelle regex, quindi evitarle non ha senso. In effetti, in alcuni sapori (ma non in Java) '\ <' and '\>' sono usati per abbinare i confini delle parole, quindi questa" soluzione "peggiorerebbe le cose. –

+0

Grazie per i vostri commenti. Aggiornato la soluzione ... –

2

Mentre ci sono altre risposte corrette, nessuno dare alcuna spiegazione.

Il motivo per cui la tua espressione regolare <.*?>.*?</.*?>|<.*?/> non funziona è perché selezionerà tutti i tag e tutto ciò che li contiene. Puoi vederlo in azione su debuggex.

Il motivo per cui il secondo tentativo <.*?></.*?>|<.*?/> non funziona è perché verrà selezionato dall'inizio di un tag fino al primo tag di chiusura che segue un tag. È una specie di boccone, ma puoi capire meglio cosa sta succedendo in this example.

Il regex necessario è molto più semplice: <.*?>. Seleziona semplicemente ogni tag, ignorando se è aperto/chiuso. Visualization.

Problemi correlati