我有以下代码来解析FTP链接的各个部分:
Regex exp = new Regex(@"(?i)ftp:\/\/(?<user>\S+?):(?<passwd>\S+?)@(?<host>\S+?.\S+?.\S+?.\S+?)");
Match m = exp.Match(@"Link: ftp://username:password@host.sub.domain.tld<ftp://username:password@host.sub.domain.tld/>");
Console.WriteLine("Host = " + m.Groups["host"].Value);
Console.WriteLine("User = " + m.Groups["user"].Value);
Console.WriteLine("Pass = " + m.Groups["passwd"].Value);
产生以下输出:
Host = host.su
User = username
Pass = password
为什么要截断主机?
答案 0 :(得分:5)
解析Uri已经在.NET中完成了。 URI的语法有太多边缘情况和变体,只能使用正则表达式。
所以使用内置支持:
var u = new Uri("ftp://username:password@host.sub.domain.tld");
var host = u.Host;
var ui = u.UserInfo.Split(':')
var user = ui[0];
var pwd = ui[1];
答案 1 :(得分:1)
因为\S
也匹配点字符,.
会匹配任何字符。
@"(?i)ftp:\/\/(?<user>\S+?):(?<passwd>\S+?)@(?<host>[^.\s]+\.[^.\s]+\.[^.\s]+\.\w+)"
<强>为什么吗
(?<host>\S+?.\S+?.\S+?.\S+?)
\S+?
- 因非贪婪而匹配第一个字符。.
- 匹配第二个字符,因为未转义的点会匹配任何字符。