2010-10-21 78 views
1

首先我發佈你一些例子字符串:解析字符串使用正則表達式

string_position = ("\"%s\";\"%s\";\"%s\";\"\";\"%s\"\r\n\"%s\";\"%s\";\"%s\";\"%s - %s\";\"%s\";\"%.0f\";\"FR\";\"%.2f\";\"%.2f\";\"%.2f\";\"%s\";\"%s\";\"%s\";\"%s\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"B\"\r\n",POSNR_NR_ID,POSNR_NR_ID,POSNR,POSNR_NR_ID,ARTNR_NR_ID,POSNR_NR_ID,CP90NAME,TEXT1,TEXT2,ARTNR_NR_ID,CNT,WIDTH,HEIGHT,DEPTH,INFO1,INFO2,INFO3,INFO4) 

string_position = ("STK_PD_BEZ|%s|STK_ID|%s|STK_EBENE|0|ID|%s\r\nSTK_ID|%s|ORDERPOS|%s|STK_EBENE|1|STK_PD_BEZ|%s|STK_FLAENGE|%.2f|STK_FBREITE|%.2f|STK_FDICKE|%.2f|ID|%s|PARENTID|%s\r\n",POSNR,ORDERID,POSNR_NR_ID,ORDERID,POSSTR,CP90NAME,WIDTH,DEPTH,HEIGHT,ARTNR_NR_ID,POSNR_NR_ID) 

所以我想分析這些字符串,但我不知道我怎麼能啓動。正如我結果,我想有兩個數組每個字符串,例如(字符串2):

array_a[0] = STK_PD_BEZ|%s; 
array_b[0] = POSNR; 

array_a[1] = STK_ID|%s; 
array_b[1] = ORDERID; 

等等

我希望你明白我的問題。我必須爲每個%s找到互補的「變量」。所以算法必須處理任何看起來像我發佈的字符串。

謝謝你的幫助。

+0

您可以改進一點,不要將您的樣品命名爲相同,並解釋兩個字符串之間的差異和相似之處。我迷失瞭如何處理示例1 – 2010-10-21 07:50:26

+0

因此,您需要在 – rerun 2010-10-21 07:52:33

+0

@rerun和Henk之前的所有內容的%s:查看第二個STRING_POSITION。這就是我試圖用我的2個數組解釋的原因。 「STK_PD_BEZ |%s」屬於(如果你向右滾動)到「POSNR」。這就是解析器必須查明的。 (其中%s屬於互補變量) – oopbase 2010-10-21 07:55:00

回答

1

只是快速實施,希望它會有用。我不會用這個特殊任務的正則表達式。我認爲簡單的解析器就足夠了。

 // const string test = "STK_PD_BEZ|%s|STK_ID|%s|STK_EBENE|0|ID|%s\r\nSTK_ID|%s|ORDERPOS|%s|STK_EBENE|1|STK_PD_BEZ|%s|STK_FLAENGE|%.2f|STK_FBREITE|%.2f|STK_FDICKE|%.2f|ID|%s|PARENTID|%s\r\n,POSNR,ORDERID,POSNR_NR_ID,ORDERID,POSSTR,CP90NAME,WIDTH,DEPTH,HEIGHT,ARTNR_NR_ID,POSNR_NR_ID"; 

     const string test = "\"%s\";\"%s\";\"%s\";\"\";\"%s\"\r\n\"%s\";\"%s\";\"%s\";\"%s - %s\";\"%s\";\"%.0f\";\"FR\";\"%.2f\";\"%.2f\";\"%.2f\";\"%s\";\"%s\";\"%s\";\"%s\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"B\"\r\n,POSNR_NR_ID,POSNR_NR_ID,POSNR,POSNR_NR_ID,ARTNR_NR_ID,POSNR_NR_ID,CP90NAME,TEXT1,TEXT2,ARTNR_NR_ID,CNT,WIDTH,HEIGHT,DEPTH,INFO1,INFO2,INFO3,INFO4"; 

     // [0] - format string 
     // [1..n] - arguments for format 
     string[] args = test.Split(','); 

     // Source parts divided by delimiters. You can extend it. 
     string[] parts = args[0].Split("|\r\n;-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

     // Format - arg pair 
     var parsed = new List<Tuple<string, string>>(); 

     // Current format string 
     var format = new List<string>(); 

     // Start from 1 since we skip format string 
     int currentValue = 1; 

     // Building 
     foreach (var part in parts) 
     { 
      if (part.Contains("%")) 
      { 
       format.Add(part); 
       parsed.Add(Tuple.Create(string.Join("|", format), args[currentValue++])); 

       format.Clear(); 
      } 
      else format.Add(part); 
     } 

     // Printing 
     foreach (var pair in parsed) 
     { 
      Console.WriteLine("{0} = {1}", pair.Item1, pair.Item2); 
     } 

     Console.ReadLine(); 

輸出:

STK_PD_BEZ |%S = POSNR

STK_ID |%S = ORDERID

STK_EBENE | 0 | ID |%S = POSNR_NR_ID

STK_ID |%s = ORDERID

ORDERPOS |%s = POSSTR

STK_EBENE | 1 | STK_PD_BEZ |%S = CP90NAME

STK_FLAENGE |%.2f = WIDTH

STK_FBREITE |%.2f = DEPTH

STK_FDICKE |%。2F = HEIGHT

ID |%S = ARTNR_NR_ID

PARENTID |%S = POSNR_NR_ID

輸出2:

「%S」= POSNR_NR_ID

「%s的「= POSNR_NR_ID

」%s「= POSNR

「」 | 「%S」= POSNR_NR_ID

「%S」= ARTNR_NR_ID

「%S」= POSNR_NR_ID

「%S」= CP90NAME

「%S = TEXT1

%S」 = TEXT2

「%S」= ARTNR_NR_ID

「到%.0f」= CNT

「FR」 | 「%2F」= WIDTH

「%.2f」= HEIGHT

「%.2f」=深度

「%S」= INFO1

「%S」= INFO2

「%S」= INFO3

「%S」=信息4


UPDATE

沒有正式的規範解析器的代碼會比正式有效的,而經驗。因此,首先我會建議您開始爲您的輸入制定規範,然後您可以輕鬆地創建解析器來接受所有有效的字符串。例如,您可以從Syntax diagrams

+0

這適用於我的第二個字符串,但作爲我的第一個字符串的結果輸出是空的... – oopbase 2010-10-21 11:37:05

+0

您沒有提供任何輸入字符串,輸出結果的規範。什麼可以視爲分隔符?你需要保留格式(即間隔符,引號等)嗎?如何檢測格式描述已結束?我只有兩個樣本。所以我只寫一個非常簡潔的例子,你可以開始。我會更新我的代碼。 – 2010-10-21 14:31:35

相關問題