2011-03-14 47 views
2

下面是示例字符串如 '/ AAA/BBB/CCC/DDD' 或 '/ AAA/ZZZ'
我希望得到一個正則表達式來獲得每個塊,像
AAA
BBB
CCC
DDD
如何解析字符串像'/ aaa/bbb/ccc/ddd'?

因此,我寫了

Regex r = new Regex(@"(/[^/]*)*"); 

但它只能得到最後一場比賽,
/DDD
我怎樣才能得到大家,馬恩,謝謝。

更新我的問題: 我知道'分裂',只是爲了好玩。 的情況是我有一個字符串:

string s = @"ftp://127.0.0.1/TE ST.中文 空格CC/T # ES T.OK/# ##中文 測試##^#@!aaa.txt"; 

我想/.../之間的每個塊進行編碼(使用Uri.EscapeDataString(每個)) 我更喜歡使用Regex.Replace,這可能嗎?

回答

1

您最初的問題,採用了Regex

Regex r = new Regex(@"(/[^/]*)"); 
var matches = r.Matches("/aaa/bbb/ccc/ddd"); 

foreach (var match in matches) 
{ 
    // ... 
} 

簡單地刪除你的模式的後*

你的第二個問題:

Regex r = new Regex(@"/([^/]*)"); 
var result = r.Replace("1.1.1.1/aaa/bbb/ccc/test.ext", match => { 
    return string.Format("/{0}", Uri.EscapeDataString(match.Groups[1].Value)); 
}); 
+0

沒關係,如果我有'ftp://1.1.1.1/aaa/bbb/ccc/test.ext'這樣的字符串,我想替換'aaa'=> Uri.EscapeDataString('aaa')和'bbb ','ccc','test.ext'也一樣,該怎麼做? – nonocast 2011-03-14 18:55:16

+0

用新的代碼示例更新了我的答案。 – gnab 2011-03-14 19:09:16

9

你不需要(也不應該使用)正則表達式的東西這麼簡單。

string s = "/aaa/bbb/ccc/ddd"; 
var blocks = s.Split('/'); 
foreach(var block in blocks) { 
    Console.WriteLine(block); 
} 

輸出:

aaa 
bbb 
ccc 
ddd 

編輯:哦,我知道你想要做什麼。所以,現在我們不想刪除空條目,我們想說的

string encoded = String.Join("/", blocks.Select(b => Uri.EscapeDataString(b))); 
+0

我知道 '拆分' :) – nonocast 2011-03-14 18:39:47

+0

嘗試通過Uri.EscapeDataString(每塊) – nonocast 2011-03-14 18:46:11

+0

@nonocast Regex.Replace每個塊:見我的編輯。 – jason 2011-03-14 19:17:04

5

在這種情況下,爲什麼不拆上/?

String[] split = "/aaa/bbb/ccc/ddd".split("/"); 

(注意,它已經有一段時間,因爲我寫C#,因此上述可能包含一個或兩個錯誤,但是思路應該是清楚的。)

+0

String [] split =「/aaa/bbb/ccc/ddd".Split('/');這就是所有需要做的改變! – Venki 2011-03-14 18:41:50

0

你可能會調用比賽方法和要匹配。但是,你也可以使用split方法,只是分割「/」(如果我理解你的使用正確)。

要更換:

public void Replace(string input) 
{ 
    Regex r = new Regex(@"(/[^/]*)"); 
    var matchEval = new MatchEvaluator(Encode); 
    r.Replace(input, matchEval); 
} 

public string Encode(Match m) 
{ 
    //TODO: Encode the match 
} 

注:我沒有運行此,但方式應該是合理的。

1

感謝大家,今天早上我寫了他們。

string s = @"ftp://127.0.0.1/# #/中 文.NET/###_%TRY 字符.txt"; 

s = ftpUrlPattern.Replace(s, new MatchEvaluator((match) => { 
    return "/" + Uri.EscapeDataString(match.Groups["tag"].Value); 
})); 

的模式是這樣的:

static Regex ftpUrlPattern = new Regex(@"(?<!/)/(?<tag>[^/]+)");