我正在编写一个自定义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
我甚至在哪里开始解决这个问题?
答案 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
给定的模式是一个简单的演示模式。所以,如果你想这样做,你应该创建复杂,完整和正确的模式,以使代码正常工作。如果您有任何疑问或问题,请告诉我。