Есть ли в .NET Framework метод ReadWord ()? - PullRequest
1 голос
/ 15 мая 2009

Я бы не хотел заново изобретать то, что уже было написано, поэтому мне интересно, есть ли где-нибудь в .NET Framework функция ReadWord (), которая извлекает слова на основе некоторого текста, разделенного пробелами и переносами строк.

Если нет, есть ли у вас реализация, которой вы хотели бы поделиться?

string data = "Four score and seven years ago";
List<string> words = new List<string>();
WordReader reader = new WordReader(data);

while (true)
{
   string word =reader.ReadWord();
   if (string.IsNullOrEmpty(word)) return;
   //additional parsing logic goes here
   words.Add(word);
}

Ответы [ 2 ]

5 голосов
/ 15 мая 2009

Не как таковой, однако вы можете использовать String.Split для разделения строки на массив строк на основе символа или строки-разделителя. Вы также можете указать несколько строк / символов для разделения.

Если вы предпочитаете делать это без загрузки всего в память, вы можете написать свой собственный класс потока, который делает это так, как он читает из потока, но вышеизложенное является быстрым решением для небольшого количества разделения слов данных. *

5 голосов
/ 15 мая 2009

Не то, чтобы я знал об этом напрямую. Если вы не против получить их все за один раз, вы можете использовать регулярное выражение:

Regex wordSplitter = new Regex(@"\W+");
string[] words = wordSplitter.Split(data);

Если у вас есть начальные / конечные пробелы, вы получите пустую строку в начале или конце, но вы всегда можете сначала вызвать Trim.

Другой вариант - написать метод, который читает слово на основе TextReader. Это может быть даже метод расширения, если вы используете .NET 3.5. Пример реализации:

using System;
using System.IO;
using System.Text;

public static class Extensions
{
    public static string ReadWord(this TextReader reader)
    {
        StringBuilder builder = new StringBuilder();
        int c;

        // Ignore any trailing whitespace from previous reads            
        while ((c = reader.Read()) != -1)
        {
            if (!char.IsWhiteSpace((char) c))
            {
                break;
            }
        }
        // Finished?
        if (c == -1)
        {
            return null;
        }

        builder.Append((char) c);
        while ((c = reader.Read()) != -1)
        {
            if (char.IsWhiteSpace((char) c))
            {
                break;
            }
            builder.Append((char) c);
        }
        return builder.ToString();
    }
}

public class Test
{
    static void Main()
    {
        // Give it a few challenges :)
        string data = @"Four score     and

seven years ago    ";

        using (TextReader reader = new StringReader(data))
        {
            string word;

            while ((word = reader.ReadWord()) != null)
            {
                Console.WriteLine("'{0}'", word);
            }
        }
    }
}

Выход:

'Four'
'score'
'and'
'seven'
'years'
'ago'
...