2011-08-10 125 views
1

我有一個包含下面的一行代碼的多次出現某些頁面內容:C#正則表達式匹配可選

<li class="r"><h3><a href="/test-url.htm">test string</a></h3></li> 

我使用.NET正則表達式來查找內容的所有事件,並返回我的HREF的錨標籤。

我的問題是,有時<li>有引號類纏(如上圖所示),但其他人沒有,只是有:class=r

我需要對陣雙方的匹配和不帶引號。

我試過各種方法,但似乎沒有任何工作。有報價時,它們全都匹配,但不是沒有報價。下面是我當前的嘗試:

Regex _Regex = new Regex(@"<li class=(?:"")g([^>])*>((?!<h3).)*<h3([^>])*><a\shref=""(?<URL>[^""]*)""([^>])*>((?!</li).)*", RegexOptions.IgnoreCase); 

任何幫助是非常讚賞,

感謝。

+0

正則表達式不擅長處理HTML。如果你只是想找到重複,你可能會更好使用xpath –

+2

我知道我沒有回答你的問題,但你不應該使用正則表達式來解析HTML。改爲使用[Html Agility Pack](http://htmlagilitypack.codeplex.com/)會更好。 – Justin

+0

+1這個想法,非常好用。 – Marc

回答

5

我認爲你想要的格式是

「」?

問號標誌着前面的字符爲可選。

+0

這工作完美:)感謝您的幫助。 –

0

這是正則表達式的一部分。我想你知道如何finigh它:

<li class=["r]+?> 

<li class=["]?r["]?> 

他們兩人的作品。

1

訣竅是匹配並捕獲可選的第一個引號,因此該組最終包含一個引號或一個空字符串。然後,在單詞末尾使用反向引用來再次匹配相同的內容。

@"<li class=(""?)r\1[^>]*>" 

在一個側面說明,這將出現在您的正則三次,這是錯誤的:([^>])*。它匹配你想要它,但它只有捕獲最後一個字符。如果需要捕獲這些段,則應該在組內移動星號。如果你不需要需要捕獲它,只需要像我一樣擺脫括號。