.NET Framework中是否有ReadWord()方法?

Eve*_*ien 1 .net c# parsing text

我不想重新发明已编写的东西,所以我想知道.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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

不是我直接意识到的.如果你不介意一次性完成它们,你可以使用正则表达式:

Regex wordSplitter = new Regex(@"\W+");
string[] words = wordSplitter.Split(data);
Run Code Online (Sandbox Code Playgroud)

如果你有前导/尾随空格,你会在开头或结尾得到一个空字符串,但你总是可以Trim先调用.

另一种选择是编写一个基于a读取单词的方法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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

'Four'
'score'
'and'
'seven'
'years'
'ago'
Run Code Online (Sandbox Code Playgroud)


小智 5

不是这样,但是您可以使用String.Split将字符串拆分为基于分隔字符或字符串的字符串数组.您还可以为拆分指定多个字符串/字符.

如果您不想将所有内容都加载到内存中,那么您可以编写自己的流类,在从流中读取时执行它,但上面是对少量数据字拆分的快速修复.