Нужна помощь с регулярным выражением для извлечения данных внутри тегов - PullRequest
0 голосов
/ 10 апреля 2011

В течение некоторого времени я изо всех сил пытался создать регулярное выражение, соответствующее моей потребности в приведенном ниже HTML-коде.Я использую пакет java.util.regex. *, И по разным причинам мне нужно использовать этот пакет, а не какую-либо стороннюю библиотеку.

Мне нужно извлечь данные из тегов, поэтомуданные, которые я хочу получить в этом конкретном HTML-коде, - это 25/25, Линдхаген, 0, Спиннингхолл, 35 и Test Person.

Можно ли создать для этого регулярное выражение?

<div id="rsv_detail">
  <hr />

  <label>Bokningsstatus</label>
  <span>&nbsp;</span>

  <label>Bokningar</label>

  <span>25 / 25 &nbsp;</span>

  <br />

  <label>Plats</label>
  <span>Lindhagen&nbsp;</span>

  <label>Anlänt</label>
  <span>0&nbsp;</span>

  <br />

  <label>Sal</label>
  <span>Spinninghall&nbsp;</span>

  <label>Max antal</label>
  <span>35&nbsp;</span>
  <br />

  <label>Ledare</label>

  <span>Test Person&nbsp;</span>
  <br /><br />


  <label>Visa mer</label>
  <span>      
    <a href="/index.php?instructors%5B%5D=X129518&amp;func=la&amp;tak=0.36507500+1302460619">Ledare</a>
    <a href="/index.php?locations=LI&amp;func=la&amp;tak=0.36507500+1302460619">Plats</a>
    <a href="/index.php?activities=SP_MEDEL&amp;func=la&amp;tak=0.36507500+1302460619">Aktivitet</a>

  </span>
  <br /><br />

  <br />
  <br />
  <hr />
</div>

Ответы [ 4 ]

4 голосов
/ 11 апреля 2011

Насколько я знаю, лучший способ извлечь информацию из HTML - это использовать анализатор HTML или преобразовать HTML в XHTML и извлечь его с помощью стандартных методов XML.Почему вы не можете использовать сторонние библиотеки?

1 голос
/ 11 апреля 2011
Pattern p = Pattern.compile("<span>([^<&]+)&nbsp;</span>");
Matcher m = p.matcher(text);
while (m.find())
{
  System.out.println(m.group(1));
}

output:

25 / 25
Lindhagen
0
Spinninghall
35
Test Person

Предполагается, что цель <span> всегда заканчивается &nbsp; и никогда не содержит никаких других объектов или элементов.

0 голосов
/ 11 апреля 2011

'<span>(.*?)&amp;</span>' как будет делать RE, не так ли?

0 голосов
/ 11 апреля 2011

Если вы отфильтровываете каждую строку, которая не открывает и не закрывает тег span в одной и той же строке, вы можете использовать:

filtered.replaceAll ("<span>([^<]*)</span>", "$1")
  .replaceAll ("&nbsp;", "")

Парантезы создают группу захвата, на которую вы позже ссылаетесьслева направо по первому пареню по номеру - здесь он всего один, следовательно, 1 доллар.После открывающего тега вы читаете все, кроме ^ знака «меньше», который, как вы ожидаете, будет закрывающим тегом, до закрывающего тега.

Однако в большинстве случаев я бы согласился со Stema и Hovercraft Full Of Eels.Подводные камни для регулярного выражения в html:

  • Открывающий и закрывающий тег трудно найти с помощью регулярного выражения, если они охватывают несколько строк, и более того, если они вложенные.
  • Теги внутри Комментарии трудно обнаружить

Однако есть редкие случаи, когда полезны регулярные выражения:

  • Одноразовые задания, где вы наблюдаете за всемипоступающий вход.
  • Сгенерированный HTML, который всегда будет выглядеть одинаково, например, из роутеров или javadocs
  • HTML, который вы создаете самостоятельно с учетом своей программы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...