如何逐字阅读课文
本文关键字:何逐字 | 更新日期: 2023-09-27 18:02:15
我正在使用txt或htm文件。目前我是一个字符一个字符地查找文档,使用for循环,但我需要一个单词一个单词地查找文本,然后在单词内一个字符一个字符地查找。我该怎么做呢?
for (int i = 0; i < text.Length; i++)
{}
一个简单的方法是使用不带参数的string.Split
(通过空白字符分割):
using (StreamReader sr = new StreamReader(path))
{
while (sr.Peek() >= 0)
{
string line = sr.ReadLine();
string[] words = line.Split();
foreach(string word in words)
{
foreach(Char c in word)
{
// ...
}
}
}
}
我使用StreamReader.ReadLine
来读取整行。
要解析HTML,我将使用一个健壮的库,如 htmllagilitypack 。
您可以使用空白分割字符串,但是您必须处理标点符号和HTML标记(您说您正在处理txt和htm文件)。
string[] tokens = text.split(); // default for split() will split on white space
foreach(string tok in tokens)
{
// process tok string here
}
这是我对StreamReader
的懒惰扩展的实现。这个想法是不要将整个文件加载到内存中,特别是如果你的文件是一个单独的长行。
public static string ReadWord(this StreamReader stream, Encoding encoding)
{
string word = "";
// read single character at a time building a word
// until reaching whitespace or (-1)
while(stream.Read()
.With(c => { // with each character . . .
// convert read bytes to char
var chr = encoding.GetChars(BitConverter.GetBytes(c)).First();
if (c == -1 || Char.IsWhiteSpace(chr))
return -1; //signal end of word
else
word = word + chr; //append the char to our word
return c;
}) > -1); // end while(stream.Read() if char returned is -1
return word;
}
public static T With<T>(this T obj, Func<T,T> f)
{
return f(obj);
}
使用简写:
using (var s = File.OpenText(file))
{
while(!s.EndOfStream)
s.ReadWord(Encoding.Default).ToCharArray().DoSomething();
}
使用text.Split(' ')
按空格将其分割为一个单词数组,然后遍历该数组。
foreach(String word in text.Split(' '))
foreach(Char c in word)
Console.WriteLine(c);
您可以在空白空间上分割:
string[] words = text.split(' ')
将为您提供一个单词数组,然后您可以遍历它们。
foreach(string word in words)
{
word // do something with each word
}
我认为你可以使用分割
var words = reader.ReadToEnd().Split(' ');
或
foreach(String words in text.Split(' '))
foreach(Char char in words )
您可以使用HTMLAgilityPack从某些HTML中获取所有文本。如果你觉得这太夸张了,看看这里。
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//text()"))
{
var nodeText = node.InnerText;
}
则可以将每个节点的文本内容拆分为单词,一旦定义了单词是什么。
也许像这样,
using HtmlAgilityPack;
static IEnumerable<string> WordsInHtml(string text)
{
var splitter = new Regex(@"[^'p{L}]*'p{Z}[^'p{L}]*");
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//text()"))
{
foreach(var word in splitter.Split(node.InnerText)
{
yield return word;
}
}
}
然后,检查每个单词
中的字符foreach(var word in WordsInHtml(text))
{
foreach(var c in word)
{
// a enumeration by word then char.
}
}
regexp是什么?
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApplication58
{
class Program
{
static void Main()
{
string input =
@"I'm working with a txt or htm file. And currently I'm looking up the document char by char, using for loop, but I need to look up the text word by word, and then inside the word char by char. How can I do this?";
var list = from Match match in Regex.Matches(input, @"'b'S+'b")
select match.Value; //Get IEnumerable of words
foreach (string s in list)
Console.WriteLine(s); //doing something with it
Console.ReadKey();
}
}
}
它可以与任何分隔符一起使用,并且它是最快的方法。