Есть ли в C# String Tokenizer, как в Java?

Я занимаюсь простым синтаксическим анализом ввода строки, и мне нужен токенизатор строки. Я новичок в C#, но программировал Java, и кажется естественным, что в C# должен быть токенизатор строк. Является ли? Где это находится? Как мне его использовать?

Тот же вопрос: stackoverflow.com/questions/1134311/…

Mikhail 04.11.2010 15:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
69
1
134 068
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Я думаю, что ближайший к .NET Framework -

string.Split()

Метод разделения строки - это то, что вам нужно. Фактически, класс токенизатора в Java устарел в пользу метода разделения строк Java.

AFAI, он действительно устарел, но не в пользу метода String#split. Более-менее в пользу класса Scanner.

bvdb 20.01.2017 15:50
Ответ принят как подходящий

Вы можете использовать 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. Полезный класс может быть в порядке, но использование здесь метода расширения было бы злоупотреблением.

Sam Harwell 16.07.2009 01:48

использовать Regex.Split(string,"#|#");

Почему? Что это значит?

TheRubberDuck 03.12.2014 20:08

прочтите это, функция разделения имеет перегрузку, принимает массив, состоящий из разделителей 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 для упрощения токенизации.

call me Steve 02.09.2016 23:37

Если вы пытаетесь сделать что-то вроде разделения аргументов командной строки в приложении .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;
}

Другие вопросы по теме