通过含义检索URI的一部分

时间:2012-12-22 13:55:34

标签: c# .net vb.net uri

我正在编写一个自定义URI解析器(扩展GenericUriParser),以便我的程序能够处理unix / linux风格的smb://nfs:// URI。

为了做到这一点,我需要覆盖GetComponents方法,该方法负责填充Uri对象的各种属性(例如主机,路径,绝对URI ...)。这是我被卡住的地方。我完全不知道如何按意义“分割”输入字符串。

有效输入的示例(仅限smb,nfs更复杂):

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

我甚至在哪里开始解决这个问题?

1 个答案:

答案 0 :(得分:2)

我建议您使用Regex。对于相关的给定网址,正则表达式模式可能是这样的:

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

您可以将网址与模式匹配,并按名称提取部分。 E.g。

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;
}

对于有问题的给定网址,我们会有以下变量:

// 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

给定的模式是一个简单的演示模式。所以,如果你想这样做,你应该创建复杂,完整和正确的模式,以使代码正常工作。如果您有任何疑问或问题,请告诉我。