2015-06-15 46 views
0

我有以下代码来解析一个FTP链接的部分:正则表达式来解析FTP链接字符串

Regex exp = new Regex(@"(?i)ftp:\/\/(?<user>\S+?):(?<passwd>\S+?)@(?<host>\S+?.\S+?.\S+?.\S+?)"); 
Match m = exp.Match(@"Link: ftp://username:[email protected]<ftp://username:[email protected]/>"); 

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 

为什么在主机被截断?

回答

1

由于\S也匹配点字符和.将匹配任何字符。

@"(?i)ftp:\/\/(?<user>\S+?):(?<passwd>\S+?)@(?<host>[^.\s]+\.[^.\s]+\.[^.\s]+\.\w+)" 

DEMO

为什么?

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

韦尔普,现在你已经在非贪我的回答只是看起来像已经来不及了评论编辑。 – Rawling

5

解析Uri's已经在.NET中完成。 URI的语法有太多的边界情况和变化,只是使用正则表达式。

因此,使用内置的支持:

var u = new Uri("ftp://username:[email protected]"); 

var host = u.Host; 
var ui = u.UserInfo.Split(':') 
var user = ui[0]; 
var pwd = ui[1]; 
+0

我没有一个干净的字符串与URI - 我试图找到它在一个文本块,因此正则表达式。 – JeffR