2010-03-30 11 views
5

Mam prosty plik xml i chcę usunąć wszystko przed pierwszym tagiem <item>.Proste wyrażenie regularne java zastąpić pytanie

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

Poniższy kod Java nie działa:

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

Co to jest poprawny sposób to zrobić? I jak rozwiązać problem braku chciwości? Przepraszam, jestem programistą C#.

+5

Krótka odpowiedź: nie. Nawet Jon Skeet nie może parsować XML za pomocą wyrażeń regularnych. http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – Thomas

Odpowiedz

4

dobrze, jeśli chcesz użyć wyrażenia regularnego, a następnie można użyć replaceAll. Rozwiązanie to wykorzystuje niechętnie kwantyfikatora i wstecznych:

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

Alternatywnie można użyć replaceFirst. To rozwiązanie wykorzystuje pozytywny uprzedzający.

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

To sprawia, że ​​więcej sensu po prostu użyć indexOf i substring, choć.

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

Powodem replace nie działa to, że ani char ani CharSequence przeciążenia regex jest oparte. To prosta wymiana znaków (sekwencja).


Ponadto, jak ostrzegają inne osoby, chyba że przetwarzasz proste pliki XML, nie powinieneś używać wyrażeń regularnych. Zamiast tego należy użyć rzeczywistego analizatora składni XML.

1

użycie

replaceAll 

lub

replaceFirst 

prostu zastąpić wyszuka ciąg pasuje HTH

+0

To działa. Dzięki! Ale dlaczego powyższe wyrażenie regularne nie działa? – Yang

+0

replace() nie przyjmuje wyrażenia regularnego. Interpretuje swoje argumenty jako ciągi literalne. –

3

... Jaki jest prawidłowy sposób na zrobienie tego tego? ...

Ponieważ pytanie o prawidłowy sposób, poprawny sposób to zrobić, to parsować XML i usunąć węzły i ponownie szeregować do String. Nigdy nie powinieneś używać wyrażeń regularnych do manipulowania XML lub jakimkolwiek innym zorganizowanym dokumentem, który ma dostępne parsery (JSON, YAML itp.).
Dla małych XML sugerowałbym JDOM.