2011-01-26 3 views
1

У меня есть текст внутри html-тегов в документе. Текст выглядит примерно такКак удалить текст между <ref> и </ref >

I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too 

и

I need this text &lt;ref Some random text /&gt; I need this text too 

Как так я удалить ненужный текст вместе с тегами ограждающих?


Я пробовал использовать это регулярное выражение. Но это не работает.

&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt; 

и

&lt;ref(.*?)&gt; 

Попытка этот путь в Java не помогает:

regex = "&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt;"; 
p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE); 
m = p.matcher(s); 
while(m.find()){ 
    m.replaceAll(" ");   
} 

Любая идея, как я могу получить решение?

+0

Фактические HTML-теги не будет использовать идентификаторы сущностей, как < –

+0

я пропустил, чтобы добавить, что у меня есть HTML-данные в формате XML в пределах тегов. Я проанализировал тэг xml и извлек данные html. Из этого я должен удалить некоторые нежелательные html-теги. Вот почему теги данных HTML похожи на < и > –

ответ

2

Во-первых, используйте парсер HTML. Регулярные выражения не смогут надежно справиться с этой задачей, если HTML становится сложным.

Во-вторых, ваши регулярные выражения кажутся хорошо сформированные и work as expected на простых примерах (один раз я изменил &lt; к <, то есть, но я подозреваю, что вы сделали это изменение, отправляя вопрос, полагая, что StackOverflow бы извратить его). Проблема может быть в вашем Java-коде, а не в самом регулярном выражении. Я не знаком с регулярным API для выражения Java, так что я дам кому-то еще взвешивается на что :)

+0

Кажется, что существуют ограничения для класса Pattern или класса String Java. Такое же регулярное выражение работает на http://regexpal.com. Но с моим кодом Java это не работает! –

0
  1. HTML разбор с RegEx should be avoided.

  2. Поскольку ваш относительно простой, допустим, мы идем на это. Вы соответствуете актуальному HTML, так что вы не хотите &lt;, вы хотите, чтобы фактические < (&gt;, > соответственно).

    <ref[^>]*/>|<ref>[^<]*</ref> 
    

    Если сделать трюк, насколько я знаю, я не использовал регулярных выражений в Java, хотя, так что я не знаю, если там нужно бежать в ней /.

0

Строки неизменны, так replaceAll(), как и любой другой метод «строка-мутационного», возвращает результат в виде новой строки.

String[] ss = { 
    "I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too", 
    "I need this text &lt;ref Some random text /&gt; I need this text too" 
}; 

String r = "&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt;|&lt;ref(.*?)&gt;"; 

Pattern p = Pattern.compile(r, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
for (String s0 : ss) 
{ 
    Matcher m = p.matcher(s0); 
    String s1 = m.replaceAll(""); 
    System.out.printf("%n%s%n%s%n", s0, s1); 
} 

выход:

I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too
I need this text I need this text too

I need this text &lt;ref Some random text /&gt; I need this text too
I need this text I need this text too

Некоторые другие примечания:

  • Когда я объединил ваши регулярные выражения, мне пришлось использовать более длинный вариант, как , первый вариант. Важно, чтобы они были опробованы в этом порядке, потому что более короткий (для пустых/самозакрывающихся тегов) может совпадать в обычном теге, где вы этого не хотите.

  • Вам не нужно звонить по телефону find(); это первое, что replaceAll(). Если совпадений нет, он просто возвращает исходную строку.

  • Флаг MULTILINE не делает ничего полезного, так как нет линии якоря (^ и $) в своем регулярном выражении (или в шахте).

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