需要有关正则表达式的帮助来提取标签内的数据

时间:2011-04-10 19:56:48

标签: java regex

我一直在努力创建一个适合我对HTML的需求一段时间的正则表达式。我使用java.util.regex。*包,出于不同的原因,我需要使用这个包而不是任何第三方库。

我想要的是提取标签内的数据,因此我想要的数据是25/25,Lindhagen,0,Spinninghall,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 个答案:

答案 0 :(得分:4)

据我所知,从HTML中提取信息的最佳方法是使用HTML解析器或将HTML转换为XHTML并通过标准XML技术提取它。为什么不能使用第三方库?

答案 1 :(得分:1)

Pattern p = Pattern.compile("<span>([^<&]+)&nbsp;</span>");
Matcher m = p.matcher(text);
while (m.find())
{
  System.out.println(m.group(1));
}

输出:

25 / 25
Lindhagen
0
Spinninghall
35
Test Person

这假设目标<span>始终以&nbsp;结尾,并且从不包含任何其他实体或元素。

答案 2 :(得分:0)

如果过滤掉未打开的每一行并关闭同一行中的span-tag,您可以使用:

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

paranteheses构建了一个捕获组,您稍后将按照第一个数字从左到右引用数字 - 这里只有一个,因此为1美元。在开始标记之后,您将读取除了^一个小于号以外的所有内容,您希望它是结束标记,直到结束标记。

然而,在大多数情况下,我会同意stema和Hovercraft Full Of Eels。 html中正则表达式的陷阱是:

  • 使用正则表达式很难找到打开和关闭标记,如果它们跨越多行,等等,如果它们是嵌套的。
  • 评论中的标签很难被发现

然而,极少数情况下,正则表达式很有用:

  • 一次性工作,你监督所有即将到来的输入。
  • 生成的HTML,总是看起来相同,例如路由器或javadocs
  • 您根据自己的计划自行构建的HTML

答案 3 :(得分:0)

'<span>(.*?)&amp;</span>'作为RE会做,不是吗?