方法 : URL からプロトコルとポート番号を抽出する

次の例では、URL からプロトコルとポート番号を抽出します。

警告

System.Text.RegularExpressions を使用して信頼できない入力を処理するときは、タイムアウトを渡します。 悪意のあるユーザーが RegularExpressions に入力を提供して、サービス拒否攻撃を行う可能性があります。 RegularExpressions を使用する ASP.NET Core フレームワーク API は、タイムアウトを渡します。

例では Match.Result メソッドを使用して、後にコロンとポート番号が続くプロトコルを返します。

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string url = "http://www.contoso.com:8080/letters/readme.html";

      Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
                          RegexOptions.None, TimeSpan.FromMilliseconds(150));
      Match m = r.Match(url);
      if (m.Success)
         Console.WriteLine(m.Result("${proto}${port}"));
   }
}
// The example displays the following output:
//       http:8080
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim url As String = "http://www.contoso.com:8080/letters/readme.html"
        Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
                           RegexOptions.None, TimeSpan.FromMilliseconds(150))

        Dim m As Match = r.Match(url)
        If m.Success Then
            Console.WriteLine(m.Result("${proto}${port}"))
        End If
    End Sub
End Module
' The example displays the following output:
'       http:8080

この正規表現パターン ^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/ の解釈を次の表に示します。

Pattern 説明
^ 文字列の先頭から照合を開始します。
(?<proto>\w+) 1 つ以上の単語文字に一致します。 このグループに proto と名前を付けます。
:// 後に 2 つのスラッシュ記号が続くコロンと一致します。
[^/]+? スラッシュ記号以外の任意の文字の 1 回以上の (ただし、可能な限り少ない) 出現と一致します。
(?<port>:\d+)? 後に 1 桁以上の文字が続くコロンの 0 回または 1 回の出現と一致します。 このグループに port と名前を付けます。
/ スラッシュ記号に一致します。

Match.Result メソッドは、正規表現パターンでキャプチャされた 2 つの名前付きグループの値を連結する、${proto}${port} 置換シーケンスを展開します。 これは、Match.Groups プロパティによって返されたコレクション オブジェクトから取得した文字列を明示的に連結するための便利な代替です。

例では、Match.Result メソッドを 2 つの置換 ${proto}${port} とともに使用して、キャプチャされたグループを出力文字列に含めます。 代わりに、次のコードに示されているように、一致の GroupCollection オブジェクトから、キャプチャされたグループを取得することができます。

Console.WriteLine(m.Groups["proto"].Value + m.Groups["port"].Value);
Console.WriteLine(m.Groups("proto").Value + m.Groups("port").Value)

関連項目