2013-01-16 75 views
1

目前我正在學習正則表達式,還有很多我不明白的東西。正則表達式可選組不能正常工作

我有一張桌子的網站,我想要提取物品。其中一列可以包含固定值(在本例中爲「foo」)或不包含任何內容,其他列始終包含一些數據。提取它們的效果很好,但特殊欄中的可選內容不適用。因此,我使用像

<a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a> 

我的實際問題的一種表達是最終的表達的以下部分

... .*?(foo)?.*? ... 

應實現與其它小區之間存在與內容FOO細胞,所述細胞能錯過並且只應在其返回時才返回。我究竟做錯了什麼?一些基本的理解?

+7

學習很棒,但正則表達式不是將數據從html中拉出的正確工具。 –

+0

什麼是從網站提取數據的好方法?正則表達式似乎是非常靈活和有趣:) – Gnietschow

+0

[HTMLAgilityPack](http://htmlagilitypack.codeplex.com/) –

回答

0

在正則表達式.*?(foo)?.*?中,由於foo是可選的,因此正則表達式引擎只會查看文本中的當前位置。如果foo在那裏,它將包含在比賽中;否則,它只會跳過而不檢查根本沒有任何foo

通過將正則表達式修改爲(.*?foo|.*?).*?,可以改變行爲。正則表達式將盡最大努力找到下一個foo。除非前面的字符串不包含foo,否則上面的正則表達式肯定會消耗foo。在regex-directed engine中,更改|是不公平的,在這種情況下,正則表達式引擎在嘗試下一個引擎之前最好匹配前面指定的引擎,並且如果它匹配任何東西,它將繼續(除非有前面的某些東西不匹配,那麼它會回頭和回溯)。

請注意,我上面演示的可能是而不是的解決方案。你應該查看數據,看看是否有任何好的功能來限制角色的消費方式,以便區分這些匹配。