C # расширенный String.Split - PullRequest
8 голосов
/ 05 июня 2011

У меня есть строка, похожая на эту:

Мальчик сказал своей матери: «Можно мне немного конфет?»

Если я сделаю нормальныйString.Split на нем я получаю:

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

Я хочу массив, подобный так:

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

Очевидно, я мог бы просто проходить по буквам за символом и отслеживатья в строке или нет и все такое ... но есть ли лучший способ?С регулярными выражениями, возможно?

Ответы [ 2 ]

9 голосов
/ 05 июня 2011

Как насчет поиска всех совпадений этого регулярного выражения:

"[^"]*"|\S+
2 голосов
/ 05 июня 2011

Зависит немного от ваших требований.Например, вам нужно рассматривать AAA "BBB (без пробелов) как слово-знак или два слова? Если AAA" BBB - это одно слово, и "только начинается с поля в кавычках после разделителя - это выглядит как синтаксический анализатор CSV. Конечно, 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);
...