2011-03-01 58 views
1

我目前正在開發一個遠程控制軟件。該單位提供以下字符串(沒有任何linebreak或什麼):從字符串中獲取各種變量的最有效方法

...some_general_infomations,param1=value1,param2=value2,param3=value3,paramN=valueN,... 

我需要以某種方式將這些值分配給一些變量。由於這個字符串的長度是變化的,我不能使用子字符串(糾正我,如果我錯了)。

什麼是最有效(最快)的方式來做到這一點?

編輯: @ Darin的解決方案,大部分的消息都工作良好,但在這裏,這是一個真正棘手:

CFG=0<\r><\n>BOU=0<\r><\n>ALA:D1=132,D2=0,D3=0<\r><\n>COD1:S=13<\r><\n>-C1=5,N1=12345678,CLS=0,VAL=0<\r><\n>-C2=5,N2=,CLS=0,VAL=0<\r><\n>COD2:S=0<\r><\n>-C1=0,N1=,CLS=0,VAL=0<\r><\n>ENT:APPEL1=0,APPEL2=0<\r><\n>USI:DEP=0,AES=1,V8K=1,FIL=1,DSP=0,RSC=1,AL3=0,TDA=1,A64=0,CCS=0,RES=0,xxx=0,xxx=0,5AS=1<\r><\n>PERF:<\r><\n>-DMIN=0,0,<\r><\n>OK<\r><\n> 

我至少需要獲得S,C1,N1的值。即使我刪除了換行符,這些參數也可以用逗號或冒號分開。 我怎麼處理這個字符串?

+0

拆分對通過<\r><\n>。 string [] pairs = words.Split(new String [] {@「<\r><\n>」},StringSplitOptions.None); – v00d00 2011-03-02 13:58:12

回答

4

一個很好的「醇拆分應該工作:

var input = "...some_general_infomations,param1=value1,param2=value2,paramN=valueN"; 
var tokens = input.Split(','); 
if (tokens.Length > 0) 
{ 
    foreach (var token in tokens) 
    { 
     var parts = token.Split('='); 
     if (parts.Length > 1) 
     { 
      string paramName = parts[0]; 
      string paramValue = parts[1]; 
     } 
    } 
} 
+0

謝謝你,我會試試這個,現在就讓你。令人難以置信的是我得到了多快的響應... – lenniep 2011-03-01 20:48:38

+0

忽略格式錯誤的數據? – 2011-03-01 20:49:06

+0

@Yuriy Faktorovich,這將取決於項目要求。在我的情況下,我無視它,因爲它是畸形的。但是如果需要處理格式不正確的字符串,這將是可能的。 – 2011-03-01 20:50:25

2

使用字符串類的Split方法。

string[] pairs = words.Split(new Char [] {','}); 
foreach(string pair in pairs) 
{ 
    string[] kv = pair.Split(new Char [] {'='}); 

    // kv[0] will hold the pair param name 
    // kv[1] will hold the pair param value 
} 

有代碼的幾個假設 - 你只需要對受,和每一對都有名稱和值之間的分隔=名稱/值。

1

正則表達式是做這件事的標準方法;像這樣:

​​
+0

RegEx似乎是解決這個問題的一個有趣的方式,但是你看過我的最後一次編輯嗎?你會如何處理該字符串? – lenniep 2011-03-02 13:42:53

+0

是「<\r><\n>」意思是表示一個換行符,0x0d 0x0a? – 2011-03-02 18:49:14

+0

下面的正則表達式會提取S的值:/ \ bS =([^,:\ r \ n] +)/ - 如果你在.NET中這樣做,你將循環遍歷返回集合。火柴()。如果它不是.NET,\ b可能不是正確的方式來斷言一個字邊界。正則表達式是一個很大的主題。 – 2011-03-02 18:49:41

相關問題