例 : HREFS のスキャン

更新 : 2007 年 11 月

入力文字列を検索して、文字列内のすべての href="..." の値と位置を出力する例を次に示します。

Regex オブジェクト

ここでは、ユーザー コードから複数回呼び出される可能性のある DumHRefs メソッドの中で Regex オブジェクトが使用されています。そこで、static (Visual Basic では Shared) Regex.Match(String, String, RegexOptions) メソッドを使用します。これにより、正規表現エンジンが正規表現をキャッシュできるようになり、メソッドを呼び出すたびに新しい Regex オブジェクトをインスタンス化するオーバーヘッドを回避できます。Match オブジェクトは、文字列内のすべての一致を反復処理するために使用されます。この例では、メタ文字 \s によってすべての空白文字を検索し、\S によってすべての非空白文字を検索しています。

Private Sub DumpHRefs(inputString As String) 
   Dim m As Match
   Dim HRefPattern As String = "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"

   m = Regex.Match(inputString, HRefPattern, _ 
                   RegexOptions.IgnoreCase Or RegexOptions.Compiled)
   Do While m.Success
      Console.WriteLine("Found href {0} at {1}.", _
                        m.Groups(1), m.Groups(1).Index)
      m = m.NextMatch()
   Loop   
End Sub
private static void DumpHRefs(string inputString) 
{
   Match m;
   string HRefPattern = "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";

   m = Regex.Match(inputString, HRefPattern, 
                   RegexOptions.IgnoreCase | RegexOptions.Compiled);
   while (m.Success)
   {
      Console.WriteLine("Found href " + m.Groups[1] + " at " 
         + m.Groups[1].Index);
      m = m.NextMatch();
   }   
}

DumHRefs メソッドを呼び出す例を次に示します。

Public Sub Main()
   Dim inputString As String = "My favorite web sites include:</P>" & _
                               "<A HREF=""https://msdn2.microsoft.com"">" & _
                               "MSDN Home Page</A></P>" & _
                               "<A HREF=""https://www.microsoft.com"">" & _
                               "Microsoft Corporation Home Page</A></P>" & _
                               "<A HREF=""https://blogs.msdn.com/bclteam"">" & _
                               ".NET Base Class Library blog</A></P>"
   DumpHRefs(inputString)                     
End Sub
' The example displays the following output:
'       Found href https://msdn2.microsoft.com at 43
'       Found href https://www.microsoft.com at 102
'       Found href https://blogs.msdn.com/bclteam/) at 176
public static void Main()
{
   string inputString = "My favorite web sites include:</P>" +
                        "<A HREF=\"https://msdn2.microsoft.com\">" +
                        "MSDN Home Page</A></P>" +
                        "<A HREF=\"https://www.microsoft.com\">" +
                        "Microsoft Corporation Home Page</A></P>" +
                        "<A HREF=\"https://blogs.msdn.com/bclteam\">" +
                        ".NET Base Class Library blog</A></P>";
   DumpHRefs(inputString);                     

}
// The example displays the following output:
//       Found href https://msdn2.microsoft.com at 43
//       Found href https://www.microsoft.com at 102
//       Found href https://blogs.msdn.com/bclteam at 176

Match 結果クラス

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

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

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

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

参照

その他の技術情報

.NET Framework の正規表現