正则表达式 - 查找和比较单词的第一个实例

时间:2010-05-28 13:59:31

标签: html regex

我目前正在尝试编写一个正则表达式来从我拥有的页面中拉出链接。问题是只有当链接有“库存”时才需要拔出链接。这是我代码明智的概述:

<td class="prd-details">
   <a href="somepage">
   ...
   <span class="collect unavailable">
   ...
</td>

<td class="prd-details">
   <a href="somepage">
   ...
   <span class="collect available">
   ...
</td>

我想做的是只有在标签中有“收集可用”的情况下才能拔出链接。我试图用正则表达式做到这一点:

(?s)prd-details[^=]+="([^"]+)" .+?collect{1}[^\s]+ available

然而,在运行它时,它会找到第一个'prd-details'类并继续前进,直到找到'collect available',从而得到不正确的结果。我想通过在单词collect之后指定{1}它只会使用它找到的单词的第一个实例,但显然我错了。我一直在尝试使用不同的东西,比如积极和消极的前瞻,但我似乎无法开始工作。

任何人都可以帮我解决这个问题吗?

谢谢,

2 个答案:

答案 0 :(得分:0)

如果您坚持使用正则表达式执行此操作,我建议采用两步拆分检查方法:

  • 首先,分成每个prd-details
  • 然后,在每个prd-details中,查看它是否包含collect available
    • 如果是,请取出href

这比尝试一步完成所有操作更容易。更易于阅读,编写和维护。

答案 1 :(得分:0)

你需要一个知道“收集不可用”的表达式是垃圾。在链接捕获后,您应该能够使用通配符进行负向前瞻。类似的东西:

prd-details[^=]+="([^"]+)"(.(?!collect un))+?collect available

这将收集链接后没有“收集联合国”的任何字符。这应该消除捕获“收集不可用”块以及“收集可用”。

我在C#中测试过将文本视为一行。根据您的语言和正则表达式库,您可能需要稍微不同的语法和选项。