2012-10-20 53 views
2

這是我正在使用的。Regex.Match簡單數組

{"allCharacters":[{"id":"410199","name":"D4rkness1939pwnz","gender":"1","skipLevel":"1","role":"alt","level":"30","generation":"1","xp":"4420578","gold":"2593","xpNextLevel":8735843},{"id":"250004","name":"Fallen_Sir_Illuminati","gender":"0","skipLevel":"0","role":"alt","level":"1","generation":"1","xp":"0","gold":"100","xpNextLevel":3000},{"id":"402615","name":"PRO_Illuminati","gender":"0","skipLevel":"0","role":"alt","level":"1","generation":"1","xp":"0","gold":"100","xpNextLevel":3000},{"id":"146314","name":"PRO_Illuminati_BRD","gender":"1","skipLevel":"0","role":"main","level":"25","generation":"17","xp":"1897767","gold":"375492","xpNextLevel":1929158},{"id":"342584","name":"PRO_Sir_Illuminati","gender":"0","skipLevel":"0","role":"alt","level":"1","generation":"1","xp":"2000","gold":"200","xpNextLevel":3000},{"id":"252818","name":"Sir_Ashton_of_Illuminati","gender":"0","skipLevel":"0","role":"alt","level":"1","generation":"1","xp":"2000","gold":"200","xpNextLevel":3000},{"id":"336515","name":"Sir_Illuminati","gender":"0","skipLevel":"0","role":"alt","level":"1","generation":"1","xp":"0","gold":"100","xpNextLevel":3000}],"currentCharacter":0} 

我試圖得到一個PRO_Illuminati_BRD,與角色「:」主要部分是正則表達式匹配的最具體的部分。 所以基本上這條線具體。

{"id":"146314","name":"PRO_Illuminati_BRD","gender":"1","skipLevel":"0","role":"main","level":"25","generation":"17","xp":"1897767","gold":"375492","xpNextLevel":1929158}, 

下面都是我已經使用了Regex.Match,但他們對D4rkness1939pwnz都只匹配。

Match RealMain = Regex.Match(RawRes, "\"id\":\"(.*?)\",\"name\":\"(.*?)\",\"gender\":\"[0-9]\",\"skipLevel\":\"0\",\"role\":\"main\""); 

Match RealMain = Regex.Match(RawRes, "\"id\":\"(.*?)\",\"name\":\"(.*?)\",\"gender\":\"(.*?)\",\"skipLevel\":\"0\",\"role\":\"main\""); 

Match RealMain = Regex.Match(RawRes, "\"id\":\"(.*?)\",\"name\":\"(.*?)\",\"gender\":\"[0-9]\",\"skipLevel\":\"0\",\"role\":\"main\",\"level\":\"(.*?)\",\"generation\":\"(.*?)\",\"xp\":\"(.*?)\",\"gold\":\"(.*?)\",\"xpNextLevel\""); 

Match RealMain = Regex.Match(RawRes, "\"id\":\"(.*?)\",\"name\":\"(.*?)\",\"gender\":\"(.*?)\",\"skipLevel\":\"0\",\"role\":\"main\",\"level\":\"(.*?)\",\"generation\":\"(.*?)\",\"xp\":\"(.*?)\",\"gold\":\"(.*?)\",\"xpNextLevel\""); 

,但他們總是返回D4rkness1939pwnz之一。 :S

我哪裏錯了?

+3

這看起來像JSON給我。爲什麼不使用JSON解析器,如[JSON.NET](http://json.net)? – Adam

+0

我只是想用正則表達式來抓住那條線,你能幫忙嗎? –

+0

我不擅長正則表達式。我強烈建議使用諸如[Regex Tester](http://regexpal.com/)之類的工具來幫助找到正確的表達式。 – Adam

回答

0

你所面臨的問題是,你只讀了第一場比賽。

要遍歷你應該使用相匹配的所有比賽:

MatchCollection matches = Regex.Matches(RawRes, "\"id\":\"(.*?)\",\"name\":\"(.*?)\",\"gender\":\"[0-9]\",\"skipLevel\":\"0\",\"role\":\"main\""); 
foreach(Match item in matches) 
{ 
    if (item.Groups[2].Value == "PRO_Illuminati_BRD") 
     return item; 
} 

另外,您應該將正則表達式改變這樣的事情:

Regex.Matches(RawRes, "^.*\"id\":\"(.*?)\",\"name\":\"PRO_Illuminati_BRD\",\"gender\":\"[0-9]\",\"skipLevel\":\"0\",\"role\":\"main\""); 

這回答了你的問題,但我建議你如果您需要更多項目而不僅僅是單個項目,請使用其他人已經描述的JSON解析器。

+0

當我使用時,MatchCollection匹配= Regex.Matches(RawRes,「\」id \「:\」[0-9] {1,20 } \」,\ 「名稱\」:\ 「\」 \ 「性別\(*?)」:\ 「[0-9] {1} \」,\ 「skipLevel \」:\ 「0 \」 ,「角色」:\「main」); 這場比賽在比賽中獲得了所有這些廢話[0] .ToString(); –

+0

「id」:「410199」,「name」:「D4rkness1939pwnz」,「gender 「:」 1" , 「skipLevel」: 「1」, 「角色」: 「ALT」, 「水平」: 「30」, 「一代」: 「1」, 「XP」: 「4420578」, 「黃金」: 「2593」, 「xpNextLevel」:8735843},{ 「ID」: 「250004」, 「名」: 「Fallen_Sir_Illuminati」, 「性別」: 「0」, 「skipLevel」: 「0」, 「角色」:「ALT 」, 「水平」: 「1」, 「代」: 「1」, 「XP」: 「0」, 「金」: 「100」, 「xpNextLevel」:3000},{ 「ID」: 「402615」, 「名」: 「PRO_Illuminati」, 「性別」: 「0」, 「skipLevel」: 「0」, 「角色」: 「ALT」, 「水平」: 「1」, 「一代」: 「1」,「XP 「:」 0" , 「金」: 「100」, 「xpNextLevel」:3000},{ 「ID」: 「146314」, 「名稱」: 「PRO_Illuminati_BRD」, 「性別」: 「1」, 「skipLevel」: 「0」,「角色」:「主要 –

+0

[A-Za-z0-9_]不能用作我的正則表達式:/? –

1

如何使用json parser,而不是正則表達式

string json = @"{""allCharacters"":[{""id"":""410199"",""name"":""D4rkness1939pwnz"",""gender"":""1"",""skipLevel"":""1"",""role"":""alt"",""level"":""30"",""generation"":""1"",""xp"":""4420578"",""gold"":""2593"",""xpNextLevel"":8735843},{""id"":""250004"",""name"":""Fallen_Sir_Illuminati"",""gender"":""0"",""skipLevel"":""0"",""role"":""alt"",""level"":""1"",""generation"":""1"",""xp"":""0"",""gold"":""100"",""xpNextLevel"":3000},{""id"":""402615"",""name"":""PRO_Illuminati"",""gender"":""0"",""skipLevel"":""0"",""role"":""alt"",""level"":""1"",""generation"":""1"",""xp"":""0"",""gold"":""100"",""xpNextLevel"":3000},{""id"":""146314"",""name"":""PRO_Illuminati_BRD"",""gender"":""1"",""skipLevel"":""0"",""role"":""main"",""level"":""25"",""generation"":""17"",""xp"":""1897767"",""gold"":""375492"",""xpNextLevel"":1929158},{""id"":""342584"",""name"":""PRO_Sir_Illuminati"",""gender"":""0"",""skipLevel"":""0"",""role"":""alt"",""level"":""1"",""generation"":""1"",""xp"":""2000"",""gold"":""200"",""xpNextLevel"":3000},{""id"":""252818"",""name"":""Sir_Ashton_of_Illuminati"",""gender"":""0"",""skipLevel"":""0"",""role"":""alt"",""level"":""1"",""generation"":""1"",""xp"":""2000"",""gold"":""200"",""xpNextLevel"":3000},{""id"":""336515"",""name"":""Sir_Illuminati"",""gender"":""0"",""skipLevel"":""0"",""role"":""alt"",""level"":""1"",""generation"":""1"",""xp"":""0"",""gold"":""100"",""xpNextLevel"":3000}],""currentCharacter"":0}"; 
var obj = new JavaScriptSerializer().Deserialize<Root>(json); 

//var character = obj.allCharacters.First(i => i.name == "PRO_Illuminati_BRD"); 
var character = obj.allCharacters.First(i => i.role == "main"); 

-

public class Root 
{ 
    public List<AnItem> allCharacters; 
} 

public class AnItem 
{ 
    public string id; 
    public string name; 
    public string gender; 
    public string skipLevel; 
    public string role; 
    public string generation; 
    public string xp; 
    public string gold; 
    public int xpNextLevel; 
} 
+0

我將使用什麼參考C#.net 4.0窗體?看起來很棒。 –

+0

@AshtonSchultz [System.Web.Script.Serialization](http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx) –

+0

我發現它:D命名空間:System .Web.Script.Serialization 程序集:System.Web.Extensions(在System.Web.Extensions.dll中) –