Вопрос

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

Это было полезно?

Решение

Вы могли бы использовать Метод 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# (Производительность, регулярное выражение)

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

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

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

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

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

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

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

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

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

string.Split()

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

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

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

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

string.SplitByMyTokens();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top