2011-06-27 2 views
1

Допустим, у меня есть XML в виде строки. Скажем, я хочу удалить содержимое между двумя тегами в XML-строке. Я пробовал:Java: String.replace (regex, string) для удаления содержимого из XML

String newString = oldString.replaceFirst("\\<tagName>.*?\\<//tagName>", 
                   "Content Removed"); 

но он не работает. Любые указания относительно того, что я делаю неправильно?

+1

Если у вас есть что-то другое, кроме самого простого, не вложенного xml, регулярное выражение не будет работать. –

ответ

6

ОК, кроме очевидного ответа (don't parse XML with regex), может быть, мы можем это исправить:

String newString = oldString.replaceFirst("(?s)<tagName[^>]*>.*?</tagName>", 
              "Content Removed"); 

Объяснение:

(?s)    # turn single-line mode on (otherwise '.' won't match '\n') 
<tagName   # remove unnecessary (and perhaps erroneous) escapes 
[^>]*   # allow optional attributes 
>.*?</tagName> 

Вы уверены, что ваши правильно соответствие случай тега? Возможно, вы также хотите добавить флаг i к рисунку: (?si)

+0

В конце концов, просто используя string.replaceFirst («. *», «Содержимое удалено»); отлично работал, я не знаю, почему я делал это настолько сложным. Спасибо за объяснение атрибутов регулярного выражения в Java, хотя, очень полезно! – TookTheRook

0

Возможно, проблема заключается здесь:

<//tagName>

Попробуйте изменить его

<\/tagName>

+0

В Java, '' будет делать красиво без каких-либо побегов. –

+0

Я попробовал его здесь, и он работал, избегая символа '/' char http://gskinner.com/RegExr/ –

+0

@Pable да, но это не использует механизм Java Regex, это flex/flash –

0

XML - это грамматика; регулярные выражения - не лучшие инструменты для работы с грамматиками.

Мой совет будет работать с реальным анализатором для работы с DOM, а не делать матчей

Например, если у вас есть:

<xml> 
<items> 
    <myItem> 
    <tagtoRemove>something1</tagToRemove> 
    </myItem> 
    <myItem> 
    <tagtoRemove>something2</tagToRemove> 
    </myItem> 
</items> 

Регулярное выражение может попытаться соответствовать его (из-за жадный механизм)

<xml> 
<items> 
    <myItem> 
    matchString 
    </myItem> 
</items> 

Кроме того, некоторые использует, что некоторый DTDs может позволить (например, <tagToRemove/> или <tagToRemove attr="value">) делают улавливающие тег с регулярными выражениями мо трудно.

Если вам не ясно, что ни одно из вышеперечисленных не может произойти (или в будущем), я бы пошел с парсером.

Смежные вопросы