本主题讨论一些可能在您使用正则表达式时出现的常见问题,提供一些用于解决这些问题的提示,并提供用于访问所捕获的字符串的过程。
与预期的模式不匹配
下面列出了一些可以对正则表达式执行的常规任务,同时列出了一些疑难解答提示,供您在未获得所期望的结果时参考:
验证字符串。 字符串验证正则表达式必须以 ^ 字符开头。 这指示正则表达式引擎从字符串的开头开始匹配指定的模式。 有关更多信息,请参见 构造验证函数 (Visual Basic)。 和 正则表达式中的定位点。
**与限定符匹配。**正则表达式限定符(*、+、?、{})是“贪婪的”,这意味着它们将匹配尽可能最长的字符串。 但是,对于某些模式,您可能想使用“惰性”匹配来获得尽可能最短的字符串。 惰性正则表达式限定符是 *?、+?、?? 和 {}?。 有关更多信息,请参见 限定符。
**与嵌套限定符匹配。**在使用嵌套限定符时,请确保所有限定符均为贪婪或惰性的。 否则,匹配的结果将难以预料。
访问捕获的字符串
一旦正则表达式找到了您所要的字符串,您可能会想捕获这些字符串,然后访问所捕获的内容。 可以使用分组构造来捕获与正则表达式中的子表达式组匹配的字符串。 有关更多信息,请参见 分组构造。
在访问利用嵌套的组捕获的字符串时要执行几个步骤。
访问捕获的文本
为正则表达式创建一个 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