2014-07-16 51 views
0

我只是想說我是VB.Net用戶,並且我知道所有關於HTML和正則表達式的問題。這僅僅是爲了我自己的學習,所以請不要建議替代方法。正則表達式忽略捕獲組中的可選HTML標記

現在的HTML

<td class="alt1 username"><a href="member.php?123-Stack" class="username">Stack</a> 
<td class="alt1 username"><a href="member.php?456-Overflow" class="username"><font color="#FF0000"><strong>Overflow</strong></font></a> 

現在你可以看到可選的字體和字符串標記。我目前的模式將捕獲第一個例子,但也可選標籤。我知道爲什麼我的模式不能確定如何包含可選標記。也許這是不可能的?

(?<=<a href=""member\.php\?\d+\-.+?"" class=""username"">).+?(?=</a>) 

感謝一如既往

+0

你想匹配什麼? – zx81

回答

0

使用此不區分大小寫的模式:

[^<>]+(?=(?:\s*</(?!a>)[^>]*>)*\s*</a>) 

看到比賽中the regex demo

要得到所有的比賽在VB.NET:

Dim ResultList As StringCollection = New StringCollection() 
Try 
    Dim RegexObj As New Regex("[^<>]+(?=(?:</(?!a>)[^>]*>)*</a>)", RegexOptions.IgnoreCase) 
    Dim MatchResult As Match = RegexObj.Match(SubjectString) 
    While MatchResult.Success 
     ResultList.Add(MatchResult.Value) 
     MatchResult = MatchResult.NextMatch() 
    End While 
Catch ex As ArgumentException 
    'Syntax error in the regular expression 
End Try 

說明

  • [^<>]+匹配字符既不<也不>(這是你的對手)
  • 先行(?=(?:</(?!a>)[^>]*>)*</a>)斷言以下是...
  • (?:</(?!a>)[^>]*>)*零個或多個標籤不屬於</a>,即</後面沒有a>,則非>字符,然後>
  • 然後關閉</a>

擴展規格

如果你想正則表達式只在類username存在時才匹配,請用此代替:

(?<=<td class="[^"]*username"><a(?:(?!</a).)+)[^<>]+(?=(?:\s*</(?!a>)[^>]*>)*\s*</a>) 
+0

供參考:增加演示和解釋。 :) – zx81

+0

這個解決方案只用兩個例子就可以令人驚歎。整個頁面如何捕捉相當多的錯誤。我會看看是否可以編輯爲我更懶惰的HTML。 –

+0

如果你添加一個例子,我可以看到出了什麼問題並修復它。謝謝! :) – zx81

相關問題