C#高级String.Split

8

我有一个类似于这个的字符串:

男孩对他的母亲说:“我可以 吃一些糖果吗?”

如果我对它进行普通的String.Split,我会得到:

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

I want an array like so:

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

显然,我可以逐个字符地循环,并跟踪我是否在字符串中等等...但是有没有更好的方法?也许使用正则表达式?


考虑“像 shell 一样解析字符串”作为这种类型问题的有用短语。 - user166390
2个回答

9

那么如何查找此正则表达式的所有匹配项:

"[^"]*"|\S+

太好了!不过还有一件事……能否将“Can I have some candy?”匹配中的引号去掉? - Entity
3
这段代码的意思是去掉字符串开头和结尾处的双引号。 - Ry-

2

根据您的要求而定。例如,您需要将“AAA”BBB(没有空格)视为单词还是两个单词?如果AAA"BBB是一个单词,并且"只在分隔符后开始引用字段 - 这看起来像CSV解析器。当然,CSV还有其他规则,例如双引号表示文字引用等 - 但您也需要定义一些类似的规则。

因此,您可以调整任何开源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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接