2010-11-13 62 views
1

(是的,我現在用正則表達式來解析HTML,它的唯一的解決辦法,我知道)快速正則表達式匹配問題

林無法建立對下面一段代碼的正則表達式中,有10%左右的網頁匹配。

<A href="viewmessage.aspx?message_id=1906782643&Guid=25851900&SID=k1fprtq2dbadgshntng1w3qb" style="text-decoration:underline">Inner Text</A> 

這是正則表達式香港專業教育學院一直在努力

下面

是代碼,我通常用它來獲得比賽的收集

Private Function Extract(ByVal source As String) As String() 
     Dim mc As MatchCollection 
     Dim i As Integer 
     mc = Regex.Matches(source, _ 
"<A href=" & Chr(34) & "viewmessage.aspx?message_id *.</A>") 
     Dim results(mc.Count - 1) As String 
     For i = 0 To results.Length - 1 
      results(i) = mc(i).Value 
     Next 
     Return results 
    End Function 

Dim str1 As String() 
     Dim str2 As String 
     Dim results As New StringBuilder 
     str1 = Extract(result) 
     For Each str2 In str1 
      results.Append(str2 & vbNewLine) 
     Next 

RTBlinks.Text = results.ToString 

誰能指出什麼即時做錯了什麼?我花了幾個小時嘗試不同的事情。

我嘗試編程主要是作爲一種愛好,所以如果我做了任何明顯的錯誤,請致歉。

+0

即使作爲一個業餘愛好者,我想你會發現它更有價值的學習如何將[HtmlAgilityPack](http://htmlagilitypack.codeplex.com/)與您的項目進行整合,並找出遍歷DOM的語法,而不是與正則表達式惡魔對抗。 – jball 2010-11-13 05:14:41

+0

謝謝生病檢查出來。 – Tom 2010-11-13 13:59:22

回答

2

你有*.你需要.*。現在,量詞*被應用於它之前的空間,並且點恰好匹配一個字符。切換兩個,刪除空間(它很重要,並且此時測試字符串中沒有空格),然後重試。

請注意.*貪婪地匹配,即儘可能多的字符(除了換行符)。因此,如果每行只有一個<A>標記,它應該仍然有效。反而更安全一點的是.*?,使點匹配儘可能少的字符;甚至更安全[^<]*這將匹配除開放角括號之外的任何東西,確保我們不會跨越標籤邊界。

但是,所有這些措施在某些情況下並不少見(認爲註釋,屬性字符串,嵌套標記,無效標記),這就是爲什麼只有在您可以精確控制輸入時才讓標記語言使用正則表達式的原因,以及知道你的侷限性。

而且,我認爲,在VB.NET,你可以通過加倍逃避它一個字符串引號內,所以你可以簡單地寫

"<A href=""viewmessage.aspx?message_id=.*?</A>" 
+0

感謝您花時間幫助我解決問題,學習了一些方便的東西。 – Tom 2010-11-13 13:58:05