11 ответов:
вы могли бы использовать строку.Метод разделения.
class ExampleClass { public ExampleClass() { string exampleString = "there is a cat"; // Split string on spaces. This will separate all the words in a string string[] words = exampleString.Split(' '); foreach (string word in words) { Console.WriteLine(word); // there // is // a // cat } } }для получения дополнительной информации см. статья Сэма Аллена о разделении строк в c# (Производительность Регулярных Выражений)
метод разбиения строки-это то, что вам нужно. На самом деле класс tokenizer в Java устарел в пользу метода разделения строк Java.
Я просто хочу подчеркнуть силу метода разделения C#и дать более подробное сравнение, особенно от кого-то, кто исходит из фона Java.
в то время как StringTokenizer в Java позволяет только один разделитель, мы можем фактически разделить на несколько разделителей, что делает регулярные выражения менее необходимыми (хотя, если вам нужно регулярное выражение, используйте регулярное выражение во что бы то ни стало!) Возьмем для примера вот это:
str.Split(new char[] { ' ', '.', '?' })это разбивается на три разных разделителя, возвращающих массив из жетонов. Мы также можем удалить пустые массивы с тем, что было бы вторым параметром для приведенного выше примера:
str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries)одна вещь, которую имеет Java String tokenizer, я считаю, что C# отсутствует(по крайней мере, Java 7 имеет эту функцию), - это возможность сохранять разделители в качестве токенов. На C#'ы Сплит будет отбрасывать маркеры. Это может быть важно, скажем, в некоторых приложениях НЛП, но для более общих приложений это может не быть проблемой.
_words = new List<string>(YourText.ToLower().Trim('\n', '\r').Split(' '). Select(x => new string(x.Where(Char.IsLetter).ToArray())));или
_words = new List<string>(YourText.Trim('\n', '\r').Split(' '). Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray())));
прочитайте это, функция разделения имеет перегрузку принимает массив состоит из разделителей http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx
аналогично методу Java является:
Regex.Split(string, pattern);здесь
string- текст, который нужно разделитьpattern- шаблон типа строки, Что такое разбиение текста
Если вы пытаетесь сделать что-то вроде разделения аргументов командной строки в консольном приложении .NET, у вас будут проблемы, потому что .NET либо сломан, либо пытается быть умным (что означает, что это так же хорошо, как сломано). Мне нужно было разбить аргументы по символу пробела, сохранив любые литералы, которые были процитированы, чтобы они не разделялись посередине. Это код, который я написал, чтобы сделать работу:
private static List<String> Tokenise(string value, char seperator) { List<string> result = new List<string>(); value = value.Replace(" ", " ").Replace(" ", " ").Trim(); StringBuilder sb = new StringBuilder(); bool insideQuote = false; foreach(char c in value.ToCharArray()) { if(c == '"') { insideQuote = !insideQuote; } if((c == seperator) && !insideQuote) { if (sb.ToString().Trim().Length > 0) { result.Add(sb.ToString().Trim()); sb.Clear(); } } else { sb.Append(c); } } if (sb.ToString().Trim().Length > 0) { result.Add(sb.ToString().Trim()); } return result; }
Если вы используете C# 3.5, вы можете написать метод расширения в System.Строка, которая делает разделение вам нужно. Затем вы можете использовать синтаксис:
string.SplitByMyTokens();дополнительная информация и полезный пример от MS здесь http://msdn.microsoft.com/en-us/library/bb383977.aspx
Comments