2012-11-13 166 views
0

我需要能夠從下面的字符串中提取值,並將它們分配給特定的變量。Dotnet從字符串中提取值

[1;1HSVC_LVL={89} CALLS_OFF={966} CALLS_Q={2} CURR_DEL={67}[K[2;1HACD_HOLD={4} AN_WAIT={3} NRDY_WRAP={9} WALK_AWAY={14} FRCD_OFF={12}[K[4;1H{EOM}[K 

實際的字符串有點長,並且包含大約16個鍵/值對。它也可以包含如上所示的無關字符。這個字符串將每隔幾秒鐘到達一次,我需要每次都快速解析出變量的值。每個鍵/值對都有一個單獨的變量。

在字符串中,我需要搜索關鍵字名稱,即'SVC_LVL'並將鍵值(包含在'{}'中,即'89'用於鍵名'SVC_LVL')分配給變量。這些值不一定每次都是相同的長度,所以我不能簡單地從字符串中刪除特定數量的字符,需要將值拉到'{}'內。

所以我真正想要的是找到每個特定鍵名稱(我事先知道),然後從下一個「{}」中取出值,將其分配給一個值,然後繼續下一個值。

不知道是否正則表達式是做這件事的最好方法,以及將單獨拉出每個表達式的例子。這樣做是否明智16倍?或者我應該以不同的方式看待?

感謝所有幫助

+2

'串.Split'可以完成你想要的所有提取。我不會爲此使用'正則表達式'。 – Oded

+0

我建議發佈實際的完整示例以獲取有關字符串數據模式的更多信息。 – Jsinh

+0

這些「無關字符」可以出現在字符串中的任何位置,還是隻出現在一個值和下一個鍵之間? –

回答

3

使用這個,如果你要搜索一個特定的鍵:

string key = "SVC_LVL"; 
string pattern = key + @"\=\{(?<value>[^\}]+)\}"; 
foreach (Match m in Regex.Matches(input, pattern)) 
{ 
    Console.WriteLine(m.Groups["value"].Value); 
} 

或者使用此列出所有鍵值對:

string patAllKeyValues = @"(?<key>[\p{L}_]+)\=\{(?<value>[^\}]+)\}"; 
foreach (Match m in Regex.Matches(input, patAllKeyValues)) 
{ 
    Console.WriteLine("{0} -> {1}", 
         m.Groups["key"].Value, 
         m.Groups["value"].Value); 
} 
+0

這會正確地消除他在他的例子字符串中提到並顯示的「無關字符」嗎? –

+0

我認爲它應該,因爲它們應該只出現在鍵/值對之外。如果工作正常,我會測試它並將其標記爲正確答案。 –

+0

非常棒,非常感謝您的幫助。 –