2016-10-13 250 views
-4

儘管有很多關於字符串拆分的文章,但我找不到解決我的問題的東西。 我需要將一個字符串拆分成一個數組,但字符串在某些字段上(通常是帶有分隔符的值)具有分隔符。c#拆分字符串與一些分隔符和分隔符

字符串類似:

約翰: 「2016年10月15日」: 「15點二十〇分十四秒」: 「經理人」

如果我運行:

string[] items = line.Split(':'); 

它將字符串拆分爲6個項目,而實際上它應該只有4個。

任何方式的拆分功能ca處理這個?

編輯: 的6項是:

John 
2016/10/15 
"15 
20 
14" 
"Manager" 

我期待的時間(十五點20分14秒),是一個項目。

+1

當您拆分它時會出現什麼結果?這6個項目是什麼? – PrestonM

+0

@PrestonM我猜想「額外」項目是由「:」分割的時間元素(分鐘,秒)。 –

+0

根據你的標準,它應該分成6個項目 - 你可以使用:「 – Jivan

回答

2

恕我直言,你需要一個2狀態的解析器:內部引號和外部引號。

存在着庫,例如Fast CSV Reader,可關於分離器(:)和引號字符("),甚至如何引號字符可以被轉義進行配置。

2

由於第一個元素沒有用引號包裹,所以它在真正拋出一個乾淨的拆分時會引發一個扳手。如果你不想使用第三方庫,這是做了一些假設,因爲我不知道什麼類型的輸入字符串在你的情況下是有效的,即如果第一個元素只是冒號?

public void GetElements() 
    { 
     var delimiter = ":"; 
     var myStr = "John:\"2016/10/15\":\"15:20:14\":\"Manager\""; 

     //Split on quotes and remove elements from the array that are the delimter 
     var elementArray = myStr.Split(new [] { '"'}, StringSplitOptions.RemoveEmptyEntries); 
     elementArray = elementArray.Where(x => x != delimiter).ToArray(); 

     //Scrub the first element to remove the delimiter 
     var firstElement = elementArray.ElementAt(0); 
     elementArray[0] = firstElement.Remove(firstElement.Length - 1); 

     foreach(var element in elementArray) Console.WriteLine(element); 

     Console.ReadKey(); 
    } 

與此假設是:

  1. 第一個「要素」的字符串中總是會解開
  2. 的字符串將遵循當前的分隔式的任何其他元素,如John:"2016/10/15":"15:20:14":"Manager":"My new string"
  3. 空元素不需要保留