2015-06-15 47 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