2013-10-20 82 views
1

我一直在嘗試並尋找一段時間來了解如何實現我的目標。選擇多個匹配

我有什麼:

(?<={).*?(?=}) 

這類作品,但不會遞歸檢查匹配。

我需要實現:

例子:

ACCOUNT{username:test}{password:pass}{email:[email protected]} 

我需要得到的是所有裏面的文字{和}。

此代碼正在被使用:

Regex r = new Regex("(?<={).*?(?=})"); 
MatchCollection mc = r.Matches(data); 

foreach (Match m in mc) 
{ 
    dataCont.addData(m.Value.Substring(0, m.Value.IndexOf(':')), 
        m.Value.Substring(m.Value.IndexOf(':') + 1)); 
} 

所以,我會結了「用戶名:測試」,「密碼:通」等。

(目前我只得到了1場。)

編輯:的代碼工作,人們可以用它作爲參考。

+0

我不知道很多正則表達式,但檢查是否允許迭代匹配 –

回答

1

嘗試簡單:

\{(?<data>.*?)\} 

或者,分離出鍵和值:

\{(?<key>.*?):(?<value>.*?)\} 

而且使用這樣的:

foreach(Match m in matches) 
{ 
    var key = m.Groups["key"].Value; 
    var value = m.Groups["value"].Value; 
} 
+0

我不確定您的示例將如何使用? ,是令人困惑的部分。我應該在那裏輸入價值嗎?如果是這樣,那麼這不是我要找的。鍵的方式會有所不同,因爲它們所用的方法被用於很多不同的事情。 – Dartz

+0

* key *和* value *是正則表達式組的名稱。當使用這種方法時,您需要迭代正則表達式返回的捕獲,如下所示:\t var input = @「ACCOUNT {username:test} {password:pass} {email:[email protected]}」; \t var pattern = @「\ {(?。*?):(?。*?)\}「; \t變種正則表達式=新的正則表達式(模式);在regex.Matches \t的foreach(匹配捕獲(輸入)) \t { \t \t Console.Out.WriteLine(capture.Value); \t} 輸出是: {用戶名:測試} { 密碼:通} { 電子郵件:[email protected]}? 我寫了評論,因爲這是一個良好和正確的答案 – pasty

+0

語法( .. )只是一種命名每個捕獲組的方法,所以不必通過索引訪問每個組,而是可以訪問i按名稱。另外,分離出正則表達式中的數據看起來比手動分割字符串更加奇妙! – Chris

2

您從data提取Substring而不是m.Value

變化

dataCont.addData(
     m.Value.Substring(0, data.IndexOf(':')), 
     m.Value.Substring(data.IndexOf(':')+1)); 

dataCont.addData(
     m.Value.Substring(0, m.Value.IndexOf(':')), 
     m.Value.Substring(m.Value.IndexOf(':')+1)); 

而且,不但得不到串您可以使用字符串Split方法 -

foreach (Match m in mc) 
{ 
    string[] keyValue = m.Value.Split(':'); 
    dataCont.addData(keyValue[0], keyValue[1]); 
} 
+0

雖然這不是問題,但這是一個問題:) – Dartz

+0

我並不是說這是答案,這是幫助我解決另一個問題,我完全錯過了。原來的問題仍然存在。 – Dartz

+0

經過這次編輯,雖然我得到三個匹配您的示例輸入。我懷疑問題必須在你的方法'addData'中。你可以用調試器計數mc值嗎? –