1. ホーム
  2. c#

[解決済み] URI文字列が有効であることを確認する方法

2023-03-07 04:47:09

質問

URI文字列が有効であること(Uriコンストラクタに供給できること)をどのように確認するのでしょうか?

今のところ、私は以下のものしか持っていませんが、明白な理由のために、私はより少ないブルートな方法を好みます。

    Boolean IsValidUri(String uri)
    {
        try
        {
            new Uri(uri);
            return true;
        }
        catch
        {
            return false;
        }
    }

Uri.IsWellFormedUriStringを試してみましたが、コンストラクタに投げられるもの全てが好きなわけではなさそうです。例えば

String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));

と出力されます。

Uri.IsWellFormedUriString says: False
IsValidUri says: True

更新/回答

Uriのコンストラクタは、デフォルトでkind Absoluteを使用します。これは、Uri.TryCreateとコンストラクタを使用しようとしたときに不一致を引き起こしていました。コンストラクターと TryCreate の両方で UriKind を一致させると、期待通りの結果を得ることができます。

どのように解決するのですか?

整形式 URI は、特定の RFC に準拠していることを意味します。あなたの例のローカル パスは、これらに準拠していません。詳しくは IsWellFormedUriString のドキュメントをご覧ください。

そのメソッドから偽の結果が出たとしても、それは Uri クラスが入力をパースできないことを意味するものではありません。URI 入力は RFC 準拠ではないかもしれませんが、それでも有効な URI である可能性があります。

更新 : あなたの質問に答えるために - Uriのドキュメントが示すように、静的メソッドである TryCreate という静的メソッドがあり、これはまさにあなたが望むことを試みて、true または false を返します (そして実際の Uri のインスタンスも)。