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

问题描述:

我目前正在尝试编写一个正则表达式来将链接从我拥有的页面中拉出。问题是仅当链接有“库存”时才需要拉出链接。这是我有什么代码明智的轮廓:正则表达式 - 查找并比较单词的第一个实例

<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 

然而上运行它,它会找到的第一个“珠三角细节”级和继续下去,直到找到“收集可用”,从而采取不正确的结果。我认为通过在收集单词后指定{1},它只会使用它找到的单词的第一个实例,但显然我错了。我一直在尝试使用不同的东西,例如积极和消极的lookahead,但我似乎无法得到任何工作。

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

感谢,

+3

你最好使用一个html解析器。 – kgiannakakis 2010-05-28 14:01:31

+0

是的,但我受限于我使用的使用正则表达式的内部软件。我们目前有一个这样的地方,但它是v。长,并在每个标记之间,所以我们得到确切的结果 – Dan 2010-05-28 14:19:49

+0

你的问题是关于正则表达式,不需要额外的标签 – SilentGhost 2010-05-28 14:28:40

你需要一个表达知道“collect unavailable”是垃圾。链接捕获后,您应该能够对通配符使用负向预览。例如:

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

这将收集链接之后没有跟随“collect un”的任何字符。这应该消除捕获“收集不可用”块和“收集可用”。

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

+0

这工作出色谢谢你!我曾尝试类似的负面看法,但一定是做错了。谢谢! – Dan 2010-05-28 15:07:02

如果你坚持使用正则表达式这样做,我推荐的2步拆分然后检查方法:

  • 首先,分成各prd-details
  • 然后,每个prd-details内,看它是否包含collect available
    • 如果是的话,然后拉出href

这是不是试图一步到位做的一切更加容易。更易于阅读,编写和维护。