疑難排解 Visual Basic 中的規則運算式
更新:2007 年 11 月
本主題會討論一些使用規則運算式時所發生的常見問題,提供一些解決這些問題的提示,以及提供存取所擷取字串的程序。
與預期模式不符
以下所列的是一些可以使用規則運算式執行的常見工作,以及未取得預期結果時的疑難排解提示:
驗證字串:字串驗證規則運算式的開頭必須為 ^ 字元。這會指示規則運算式引擎在字串的開頭處開始比對所指定的模式。如需詳細資訊,請參閱在 Visual Basic 中建構驗證函式 和基本無寬度的判斷提示。
使用數量詞進行比對:規則運算式數量詞 (*、+、?、{}) 是「窮盡」(Greedy),表示它們符合可能的最長字串。然而,針對部分模式,可能會想要使用「鬆散」(Lazy) 比對來取得可能的最短字串。鬆散規則運算式數量詞是 *?、+?、?? 和 {}?。如需詳細資訊,請參閱數量詞。
使用巢狀數量詞進行比對:使用巢狀數量詞時,請確定所有數量詞都是窮盡或都是鬆散。否則,比對的結果會很難預測。
存取擷取的字串
一旦規則運算式找到預期的字串,則可能會想要擷取那些字串,然後存取您所擷取的字串。可以使用群組建構擷取符合規則運算式之子運算式 (Subexpression) 群組的字串。如需詳細資訊,請參閱群組建構。
有數個步驟以存取使用巢狀群組所擷取的字串。
若要存取擷取的文字
建立規則運算式的 Regex 物件。
-
Match 物件包含規則運算式如何比對字串的相關資訊。
逐一查看 Match 物件之 Groups 集合中所儲存的 Group 物件。
Group 物件包含單一擷取群組中結果的相關資訊。
逐一查看每個 Group 物件之 Captures 集合中所儲存的 Capture 物件。
每個 Capture 物件都包含單一擷取子運算式的相關資訊 (包含相符的子字串和位置)。
例如,下列程式碼會示範如何存取使用內含三個擷取群組之規則運算式所擷取的字串:
''' <summary>
''' Parses an e-mail address into its parts.
''' </summary>
''' <param name="emailString">E-mail address to parse.</param>
''' <remarks> For example, this method displays the following
''' text when called with "someone@mail.contoso.com":
''' User name: someone
''' Address part: mail
''' Address part: contoso
''' Address part: com
''' </remarks>
Sub ParseEmailAddress(ByVal emailString As String)
Dim emailRegEx As New Regex("(\S+)@([^\.\s]+)(?:\.([^\.\s]+))+")
Dim m As Match = emailRegEx.Match(emailString)
If m.Success Then
Dim output As String = ""
output &= "User name: " & m.Groups(1).Value & vbCrLf
For i As Integer = 2 To m.Groups.Count - 1
Dim g As Group = m.Groups(i)
For Each c As Capture In g.Captures
output &= "Address part: " & c.Value & vbCrLf
Next
Next
MsgBox(output)
Else
MsgBox("The e-mail address cannot be parsed.")
End If
End Sub