2010-05-28 59 views
1

我目前正在嘗試編寫一個正則表達式來將鏈接從我擁有的頁面中拉出。問題是僅當鏈接有「庫存」時才需要拉出鏈接。這是我有什麼代碼明智的輪廓:正則表達式 - 查找並比較單詞的第一個實例

<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

回答

0

你需要一個表達知道「collect unavailable」是垃圾。鏈接捕獲後,您應該能夠對通配符使用負向預覽。例如:

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

這將收集鏈接之後沒有跟隨「collect un」的任何字符。這應該消除捕獲「收集不可用」塊和「收集可用」。

我在C#中進行了測試,將文本視爲單行。根據您的語言和正則表達式庫,您可能需要稍微不同的語法和選項。

+0

這工作出色謝謝你!我曾嘗試類似的負面看法,但一定是做錯了。謝謝! – Dan 2010-05-28 15:07:02

0

如果你堅持使用正則表達式這樣做,我推薦的2步拆分然後檢查方法:

  • 首先,分成各prd-details
  • 然後,每個prd-details內,看它是否包含collect available
    • 如果是的話,然後拉出href

這是不是試圖一步到位做的一切更加容易。更易於閱讀,編寫和維護。

相關問題