Есть ли на С# String Tokenizer, например, Java?

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

Ответ 1

Вы можете использовать Метод 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
        }
    }
}

Для получения дополнительной информации см. Статья Сэма Аллена о разделении строк в С# (Performance, Regex)

Ответ 2

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

Ответ 3

Я просто хочу выделить силу метода С# Split и дать более подробное сравнение, особенно от человека, который приходит из фона Java.

В то время как StringTokenizer в Java допускает только один разделитель, мы можем разделить на несколько разделителей, что делает регулярные выражения менее необходимыми (хотя, если требуется регулярное выражение, всегда используйте регулярное выражение!) Возьмем, например, следующее:

str.Split(new char[] { ' ', '.', '?' })

Это разделение на три разных разделителя, возвращающих массив токенов. Мы также можем удалить пустые массивы с тем, что было бы вторым параметром для приведенного выше примера:

str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries)

Одна вещь, к которой относится токенизатор Java String, я считаю, что С# не хватает (по крайней мере, у Java 7 есть эта функция) есть возможность сохранить разделитель (метки) как токены. С# Split отменит токены. Это может быть важно, например, в некоторых приложениях NLP, но для более общих приложений это может не быть проблемой.

Ответ 4

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

string.Split()

Ответ 5

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

Ответ 6

_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()))); 

Ответ 7

Для сложного разделения вы можете использовать регулярное выражение, создающее коллекцию соответствий.

Ответ 9

Аналогично Java-методу:

Regex.Split(string, pattern);

где

  • string - текст, который вам нужно разделить
  • pattern - шаблон строкового типа, что разделяет текст

Ответ 10

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

Ответ 11

Если вы используете С# 3.5, вы можете написать метод расширения для System.String, который вам нужен. Затем вы можете использовать синтаксис:

string.SplitByMyTokens();

Дополнительная информация и полезный пример из MS здесь http://msdn.microsoft.com/en-us/library/bb383977.aspx