2011-06-04 50 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);