




Я думаю, что ближайший к .NET Framework -
string.Split()
Метод разделения строки - это то, что вам нужно. Фактически, класс токенизатора в Java устарел в пользу метода разделения строк Java.
AFAI, он действительно устарел, но не в пользу метода String#split. Более-менее в пользу класса Scanner.
Вы можете использовать String.Split метод.
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# (Performance, Regex).
Для сложного разделения вы можете использовать регулярное выражение для создания коллекции совпадений.
Если вы используете C# 3.5, вы можете написать метод расширения для System.String, который выполняет необходимое вам разбиение. Затем вы можете использовать синтаксис:
string.SplitByMyTokens();
Больше информации и полезный пример от MS здесь http://msdn.microsoft.com/en-us/library/bb383977.aspx
Это решение локальной проблемы, а не очевидная / универсальная операция System.String. Полезный класс может быть в порядке, но использование здесь метода расширения было бы злоупотреблением.
использовать Regex.Split(string,"#|#");
Почему? Что это значит?
прочтите это, функция разделения имеет перегрузку, принимает массив, состоящий из разделителей http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx
Я просто хочу выделить мощь метода Split в C# и дать более подробное сравнение, особенно от человека, имеющего опыт работы с Java.
В то время как StringTokenizer в Java допускает только один разделитель, мы можем фактически разделить его на несколько разделителей, что делает регулярные выражения менее необходимыми (хотя, если требуется регулярное выражение, обязательно используйте регулярное выражение!) Возьмем, например, следующее:
str.Split(new char[] { ' ', '.', '?' })
Это разбивается на три разных разделителя, возвращающих массив токенов. Мы также можем удалить пустые массивы с тем, что было бы вторым параметром в приведенном выше примере:
str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries)
Одна вещь, которая есть в Java-токенизаторе String, которой, как мне кажется, не хватает 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())));
Метод похож на метод Java:
Regex.Split(string, pattern);
куда
string - текст, который нужно разбитьpattern - шаблон строкового типа, разбивающий текстИли String.Split для упрощения токенизации.
Если вы пытаетесь сделать что-то вроде разделения аргументов командной строки в приложении .NET Console, у вас возникнут проблемы, потому что .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;
}
Тот же вопрос: stackoverflow.com/questions/1134311/…