2010-03-30 21 views
5

Ho un semplice file xml e voglio rimuovere tutto prima del primo tag <item>.Semplice espressione regolare java sostituisce domanda

<sometag> 
    <something> 
    ..... 
    </something> 
    <item>item1 
    </item> 
    .... 
</sometag> 

Il seguente codice Java non funziona:

String cleanxml = rawxml.replace("^[\\s\\S]+<item>", ""); 

Qual è il modo corretto di fare questo? E come posso affrontare il problema non-goloso? Scusa, sono un programmatore C#.

+5

Risposta breve: no. Persino Jon Skeet non può analizzare XML usando espressioni regolari. http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – Thomas

risposta

4

Beh, se si desidera utilizzare regex, quindi è possibile utilizzare replaceAll. Questa soluzione utilizza un quantificatore riluttante e un backreference:

String cleanxml = rawxml.replaceAll(".*?(<item>.*)", "$1"); 

In alternativa è possibile utilizzare replaceFirst. Questa soluzione utilizza un lookahead positivo.

String cleanxml = rawxml.replaceFirst(".*?(?=<item>)", ""); 

ha più senso utilizzare solo indexOf e substring, però.

String cleanxml = rawxml.substring(rawxml.indexOf("<item>")); 

Il motivo per cui replace non funziona è che né charCharSequence sovraccarichi è regex-based. È una sostituzione di carattere semplice (sequenza).


Inoltre, come altri vi avvertono, a meno che non si stia elaborando semplici XML, non si dovrebbe usare regex. Dovresti invece utilizzare un parser XML effettivo.

1

uso

replaceAll 

o

replaceFirst 

basta sostituire cercherà stringa corrisponde HTH

+0

Funziona. Grazie! Ma perché la regex di cui sopra non funziona? – Yang

+0

replace() non accetta un'espressione regolare. Interpreta i suoi argomenti come stringhe letterali. –

3

... Qual è il modo corretto di fare questo? ...

Dato che è stato chiesto il modo corretto per farlo, analizzare l'XML e rimuovere i nodi e ri-serializzare in una stringa. Non dovresti mai usare espressioni regolari per manipolare XML o qualsiasi altro documento strutturato che abbia parser disponibili (JSON, YAML, ecc.).
Per XML piccolo suggerirei JDOM.