0

我正在编写一个自定义 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

我什至从哪里开始解决这个问题?

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 回答