正则表达式来解析FTP链接字符串

时间:2015-06-15 07:57:55

标签: c# regex

我有以下代码来解析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

为什么要截断主机?

2 个答案:

答案 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+)"

DEMO

<强>为什么吗

(?<host>\S+?.\S+?.\S+?.\S+?)
  • \S+? - 因非贪婪而匹配第一个字符。
  • . - 匹配第二个字符,因为未转义的点会匹配任何字符。
  • 同样,它只匹配主机部分中的前7个字符。
相关问题