次の方法で共有


Visual Basic における正規表現のトラブルシューティング

ここでは、正規表現を扱うときによく起こる問題について説明し、そのような問題を解決するためのヒントを示し、キャプチャされた文字列にアクセスする手順を説明します。

予期したパターンに一致しない

正規表現を使って実行できる一般的なタスクと、予期した結果が正規表現で得られない場合に役立つトラブルシューティングのヒントを以下に示します。

  • 文字列の検証。 文字列を検証する正規表現は、^ 文字で始まる必要があります。 この文字があると、正規表現のエンジンは、文字列の先頭から指定のパターンに一致する文字列の検索を開始します。 詳細については、「Visual Basic における検証関数の構築」を参照してください。 および 正規表現のアンカー を参照してください。

  • 量指定子を使った一致。 量指定子 (*、+、?、および {}) は、最長一致です。最長一致は、条件を満たし得る最も長い文字列に一致することを指します。 ただし、パターンによっては、最短一致を使って、条件を満たし得る最も短い文字列を取得する必要があります。 最短一致の正規表現量指定子は、*?、+?、??、および {}? です。 詳細については、「量指定子」を参照してください。

  • 入れ子の量指定子を使った一致。 入れ子の量指定子を使う場合には、すべての量指定子を最長一致または最短一致で統一してください。 混在していると、どの文字列に一致するか予測が困難になります。

キャプチャされた文字列へのアクセス

予期した文字列が正規表現によって検出された場合、それらの文字列をキャプチャしてから、各文字列にアクセスする必要があります。 正規表現に含まれるサブ式のグループに一致した文字列をキャプチャするには、グループ化構成体を使用できます。 詳細については、「グループ化構成体」を参照してください。

入れ子になったグループを使ってキャプチャされた文字列にアクセスするには、次の手順に従います。

キャプチャされたテキストにアクセスするには

  1. 正規表現に使用する Regex オブジェクトを作成します。

  2. Match メソッドを呼び出して、Match オブジェクトを取得します。

    Match オブジェクトには、正規表現が文字列にどのように一致したかについての情報が格納されます。

  3. Match オブジェクトの Groups コレクションに格納された Group オブジェクトを反復処理します。

    Group オブジェクトには、1 つのキャプチャ グループによるキャプチャの結果が格納されます。

  4. Group オブジェクトの Captures コレクションに格納された Capture オブジェクトを反復処理します。

    Capture オブジェクトには、キャプチャされた 1 つの部分式に関する情報が、一致した部分文字列と場所を含め、格納されます。

たとえば、次のコード例は、3 つのキャプチャ グループが含まれる正規表現でキャプチャされた文字列にアクセスする方法を示しています。

    ''' <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

参照

処理手順

Visual Basic における文字列のトラブルシューティング

概念

Visual Basic における検証関数の構築