2010-09-09 37 views
0

之後的字符我需要一個適用於以下的正則表達式模式。C#正則表達式需要 player_n

我從一個UDP服務器的響應,這是一個很長的字符串,並且每個字由\分隔,例如:

\g79g97\g879o\wot87gord\player_0\name0\g6868o\g78og89\g79g79\player_1\name1\gyuvui\yivyil\player_2\name2\g7g87\g67og9o\v78v9i7 

我需要的琴絃\player_n\後,所以在上面的例子中,我會需要name0,name1name3,

我知道這是當天的第二個正則表達式問題,但我有書(掌握正則表達式)的訂單!謝謝。

UPDATE。難以捉摸的正則表達式模式就足夠了,我可以將匹配(0)添加到文本框。但是,如果我想將所有匹配添加到文本框中,該怎麼辦?

textBox1.Text += match.Captures[0].ToString(); //this works fine. 

如何將「all」match.captures添加到文本框? :很抱歉如此蹩腳,這個Regex課對我來說是全新的。

回答

1

我認爲這個測試樣本可以幫助你

string inp = @"\g79g97\g879o\wot87gord\player_0\name0\g6868o\g78og89\g79g79\player_1\name1\gyuvui\yivyil\player_2\name2\g7g87\g67og9o\v78v9i7"; 
string rex = @"[\w]*[\\]player_[0-9]+[\\](?<name>[A-Za-z0-9]*)\b"; 
Regex re = new Regex(rex); 
Match mat = re.Match(inp); 
for (Match m = re.Match(inp); m.Success; m = m.NextMatch()) 
{ 
    Console.WriteLine(m.Groups["name"]); 
} 

您可以帶玩家的名稱m.Groups["name"]

3

試試這個:

\\player_\d+\\([^\\]+) 
+0

+1 - 提示:正則表達式,這是最好的發佈純表達沒有語言特定的添加。就像在這種情況下一樣,正則表達式符號'/ slashes /'在C#中沒有意義。 – Tomalak 2010-09-09 18:44:09

+0

謝謝你的加入!我在整個生活中都使用Perl,所以分隔符對我來說看起來很自然。 – jwueller 2010-09-09 18:45:50

+0

它沒有工作,但如果我從兩端刪除「/」,我得到一個匹配「\ player_n \ playername \」..這是好的,但我更喜歡只是「playername」本身 – brux 2010-09-09 18:46:39

1

,僅保留的球員的名字,你可以使用:

(?<=\\player_\d+\\)[^\\]+ 

(?<=\\player_\d+\\)是所謂的東西正向後看。它確保實際匹配[^\\]+之前是括號中的表達式。

在這種情況下,它甚至只針對少數幾個正則表達式引擎(幸運的是.NET),因爲它包含一個可變長度表達式(歸因於\d+)。大多數正則表達式引擎僅支持固定長度的後臺處理。

在任何情況下,後視不一定是解決此問題的最佳方法,匹配組更容易閱讀。

+0

喜tomolak,即時通訊與正則表達式由難以捉摸,因爲它工作正常。但如果我嘗試將第二個匹配添加到文本框,我會得到一個「超出範圍的錯誤」。如果我刪除那條線,第一場比賽(0)添加好了。在我比較模式的字符串中,大概有8個球員的名字:s – brux 2010-09-09 19:15:13

+0

@brux:如果你得到「超出範圍」的錯誤,你反正做錯了。總是在代碼中進行範圍檢查。 – Tomalak 2010-09-09 19:32:46