0

プログラムがunix/linuxスタイルとURIを処理できるようにするために、カスタムURIパーサー(GenericUriParserを拡張する)を作成しています。smb://nfs://

これを行うには、オブジェクトのさまざまなプロパティ(ホスト、パス、絶対URIなど)の入力を担当するGetComponentsメソッドをオーバーライドする必要があります。Uriこれは私が立ち往生しているところです。入力文字列を意味で「分割」する方法がまったくわかりません。

有効な入力の例(smbのみ、nfsはさらに複雑です):

smb://hostname/public/example.txt
smb://username:password@hostname/public/example.txt
smb://10.0.0.1/public

この問題をどこで解決し始めるのですか?

4

1 に答える 1

2

を使用することをお勧めしますRegex。問題の特定のURLの場合、正規表現パターンは次のようになります。

var pattern = 
    "^smb:\/\/((?<user>[\w-]+):(?<pwd>[\w-]+)@)?(?<host>[a-z0-9\.-]+)(?<path>.+)$";

URLをパターンと照合し、名前でパーツを抽出できます。例えば

var regex = new Regex(pattern);
var match = regex.Match(url);
if(match.Success) {
    // the url is smb
    var username = match.Groups["user"].Value;
    var password = match.Groups["pwd"].Value;
    var hostname = match.Groups["host"].Value;
    var path = match.Groups["path"].Value;
}

問題の特定のURLに対して、次の変数があります。

// smb://hostname/public/example.txt
username: string.Empty
password: string.Empty
hostname: hostname
path: /public/example.txt

// smb://username:password@hostname/public/example.txt
username: username
password: password
hostname: hostname
path: /public/example.txt

// smb://10.0.0.1/public
username: string.Empty
password: string.Empty
hostname: 10.0.0.1
path: /public

与えられたパターンは単純なデモパターンです。したがって、このようにしたい場合は、コードが正しく機能するように、複雑で完全で正しいパターンを作成する必要があります。ご不明な点や問題がございましたら、お気軽にお問い合わせください。

于 2012-12-22T14:46:49.613 に答える