2012-03-29 20 views
1

有什麼辦法來處理異常,如果regex.Matches沒有匹配,並試圖返回matches.group[]正則表達式不匹配時的疑難解答?

我有10張專輯在HTML的div列表。每個相冊有5個屬性,如album cover path,album link,album name等 我已經通過在函數中使用正則表達式matchcollection完成HTML解析,並且我爲每個屬性調用此函數。

Regex regex = new Regex(pattern, RegexOptions.Compiled); 
MatchCollection mc = regex.Matches(source); 
string icerik = mc[0].Groups[group].Captures[0].Value; 

我得到一個明確的名單如下:

  • 圖像路徑:http...
  • 專輯名稱:...

如果存在這些部件的HTML是沒有問題的。但問題是,如果,例如,第二張專輯的圖像路徑不提供在HTML?在這種情況下,不會發生匹配,並且mc[0].Groups[group].Captures[0].Value會導致超出邊界的異常。

我能做些什麼來阻止此錯誤發生?

+1

避免使用正則表達式來解析HTML。請參閱http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html請嘗試使用專門的庫(例如HtmlAgilityPack) – GolfWolf 2012-03-29 15:13:01

+0

[您是否嘗試過使用XML解析器?](http://stackoverflow.com/a/1732454/26226) – jrummell 2012-03-29 15:16:52

+0

現在我沒有足夠的時間重新啓動,但我會在下一次將這個留在我的腦海裏。謝謝:) – burakokumus 2012-03-30 08:15:42

回答

0

這應該這樣做。

if (mc.Count > 0 && 
    mc[0].Groups.Count > group && 
    mc[0].Groups[group].Captures.Count > 0) 
+0

找到更多關於它的信息if(mc.Count> 0 && mc [0] .Groups.Count>)我用作 ) 它工作得很好。非常感謝 :) – burakokumus 2012-03-30 08:50:01

0

您可以使用從LINQ到對象的Any()運算符。這需要System.Linq庫(.NET 4.0的一部分):

if (mc[0].Groups[group].Captures.Any()) 
{ 
    ... 
} 

這將告訴您Captures集合是否包含任何元素。如果沒有,那麼當然你不能拿[0]元素...

+0

我使用.net框架4.我添加了System.Linq但我無法得到任何()方法的工作。我用Olivier Jacot-Descombes的方法解決了這個問題。但是,如果你有任何猜測Any()方法爲我工作的原因,我會更感興趣。我將來需要。 非常感謝幫助:) – burakokumus 2012-03-30 08:48:48

+1

Any()比Count更爲優化,因爲只要確定存在數據項(它不計數),它就會立即停止處理。你可以在http://msdn.microsoft.com/en-us/library/bb534972.aspx – 2012-03-30 09:42:22