Как удалить тексты между <ref>и </ref> - PullRequest
1 голос
/ 26 января 2011

У меня есть текст в тегах HTML в документе.Текст выглядит примерно так:

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(" ");           
}

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

Ответы [ 3 ]

2 голосов
/ 26 января 2011

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

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

0 голосов
/ 27 января 2011

Строки являются неизменяемыми, поэтому 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);
}

output:

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

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

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

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

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

0 голосов
/ 26 января 2011
  1. Следует избегать парсинга HTML с помощью RegEx .

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...