例 : HREFS のスキャン

入力文字列を検索して、文字列内のすべての href="..." の値と位置を出力する例を次に示します。まず、コンパイル済みの Regex オブジェクトを構築し、次に Match オブジェクトを使用して、文字列内の一致するすべての文字列を反復処理して出力を行っています。

この例では、メタ文字 \s によってすべての空白文字を検索し、\S によってすべての非空白文字を検索しています。

    Sub DumpHrefs(inputString As String)
        Dim r As Regex
        Dim m As Match
    
        r = New Regex("href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))", _
            RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    
        m = r.Match(inputString)
        While m.Success
            Console.WriteLine("Found href " & m.Groups(1).Value _
                & " at " & m.Groups(1).Index.ToString())
            m = m.NextMatch()
        End While
    End Sub
    void DumpHrefs(String inputString) 
    {
        Regex r;
        Match m;

        r = new Regex("href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))",
            RegexOptions.IgnoreCase|RegexOptions.Compiled);
        for (m = r.Match(inputString); m.Success; m = m.NextMatch()) 
        {
            Console.WriteLine("Found href " + m.Groups[1] + " at " 
                + m.Groups[1].Index);
        }
    }

コンパイル済みのパターン

文字列を検索するためのループを開始する前に、このコード例では、コンパイル済みのパターンを格納するための Regex オブジェクトを作成しています。正規表現を解析したり、最適化したり、コンパイルするには、多少の時間がかかります。このため、これらの処理を何度も繰り返して行わないように、ループの外側で行っています。

Regex クラスのインスタンスは変更できません。各インスタンスは 1 つのパターンと対応し、状態は維持しません。そのため、単一の Regex インスタンスを、各種の関数や各種のスレッドで共有できます。

Match 結果クラス

検索結果は Match クラス内に格納されます。このクラスを使用して、検索処理によって抽出されたすべての部分文字列にアクセスできます。このクラスは、検索対象となった文字列や、使用された正規表現も記憶しているため、最後に検索が実行された位置から別の検索を実行するときに、それらの情報を使用できます。

明示的に指定したキャプチャ

従来の正規表現では、キャプチャするためのかっこに自動的に連番が割り当てられます。その結果、2 つの問題が発生します。1 つ目の問題は、かっこのペアの挿入や削除により、ある正規表現が修正されると、新しい番号を反映するために、番号付きのキャプチャを参照するコードをすべて書き直す必要があることです。2 つ目の問題は、ある文字列の検索用に 2 つの代替表現を用意するにあたって、さまざまなかっこを使用することがあるため、実際にどちらの代替表現から結果が返されたのかを判断するのが難しくなる可能性があることです。

これらの問題に対処するために、Regex は指定されたスロットに一致文字列をキャプチャするための構文 (?<name>…) をサポートしています。このスロットには、文字列または整数の名前を付けることができます。整数の名前を付けた方が、よりすばやく再呼び出しできます。この方法により、同一文字列に対する代替表現に一致した文字列をすべて同じスロットにキャプチャできます。競合が発生する場合は、スロットに最後にキャプチャされた一致文字列が、正当な一致文字列と見なされます。(しかし、1 つのスロットに対して複数の一致対象の完全なリストを使用できます。詳細については、Group.Captures コレクションのトピックを参照してください。)

参照

その他の技術情報

.NET Framework の正規表現