2011-06-04 62 views
8

我有類似這樣的字符串:C#先進String.Split

男孩對媽媽說,「我可以 一些糖果?」

如果我這樣做就可以了正常String.Split,我得到:

{ 'The', 'boy', 'said', 'to', 'his', 'mother', '"Can', 'I', 'have', 'some', 'candy?"' } 

我想一個數組,像這樣:

{ 'The', 'boy', 'said', 'to', 'his', 'mother', 'Can I have some candy?' } 

很顯然,我可以只通過文字環的性格和跟蹤我是否在一個字符串或所有的......但有沒有更好的方法?用正則表達式或許?

+0

考慮「解析字符串如殼」作爲這種有用的短語問 – 2011-06-04 22:53:16

回答

9

如何尋找到這個正則表達式的所有比賽:

"[^"]*"|\S+ 
+0

這是偉大的!還有一兩件事,但...是有可能從「我能有一些刪除引號糖果?「匹配? – Entity 2011-06-04 22:40:01

+3

@TheAdamGask ins:'String.Trim('「')'。 – Ryan 2011-06-04 22:45:33

2

取決於您的需求了一下。例如。你需要將AAA「BBB(無空格)作爲signle詞,還是兩個詞?如果AAA」BBB是一個單詞,並且「只在分隔符後面開始一個填充字段 - 這看起來像CSV解析器。其他規則,如雙qoutes意味着文字引號等 - 但你也需要定義一些類似的規則。

所以你可以適應任何開源的CSV解析器,或看看是否例如Microsoft.VisualBasic.FileIO.TextFieldParser的作品你

 string msg = "The boy said to his mother, \"Can I have some candy?\""; 
     System.IO.MemoryStream s = new System.IO.MemoryStream(Encoding.Unicode.GetBytes(msg)); 
     TextFieldParser p = new TextFieldParser(s, Encoding.Unicode); 
     p.Delimiters = new string[] { " ", "," }; 
     foreach(var f in p.ReadFields().Where(f => f != "")) 
      Console.WriteLine(f);