我正在寻找一种方法来检查使用C#的文本文件中是否存在“foo”单词。C#查找单词是否在文档中
我可以使用一个正则表达式,但我不确定这是否会工作,如果这个词分成两行。我列举了一个列举过程的流式处理程序,也遇到了同样的问题。
有何评论?
我正在寻找一种方法来检查使用C#的文本文件中是否存在“foo”单词。C#查找单词是否在文档中
我可以使用一个正则表达式,但我不确定这是否会工作,如果这个词分成两行。我列举了一个列举过程的流式处理程序,也遇到了同样的问题。
有何评论?
这里雅去。所以我们在阅读文件时看字符串,并跟踪第一个单词的最后一个单词组合并检查是否符合您的模式。
string pattern = "foo";
string input = null;
string lastword = string.Empty;
string firstword = string.Empty;
bool result = false;
FileStream FS = new FileStream("File name and path", FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader SR = new StreamReader(FS);
while ((input = SR.ReadLine()) != null)
{
firstword = input.Substring(0, input.IndexOf(" "));
if(lastword.Trim() != string.Empty) { firstword = lastword.Trim() + firstword.Trim(); }
Regex RegPattern = new Regex(pattern);
Match Match1 = RegPattern.Match(input);
string value1 = Match1.ToString();
if (pattern.Trim() == firstword.Trim() || value1 != string.Empty) { result = true; }
lastword = input.Trim().Substring(input.Trim().LastIndexOf(" "));
}
我也想过这个......但是如果你在文件中有“barf oogle”之类的东西,你会遇到问题。 – 2010-01-21 15:52:29
为什么输入文件在单词中有刹车?其中“f”在一行上,“oo”是下一行的开头? – 2010-01-21 16:05:50
我真的不认为foo是他真正在寻找的词。我的观点是,如果你做一个.Replace(“”,“”),它会把所有的单词结合在一起。 – 2010-01-21 16:10:11
简单搜索有什么问题?
如果文件不是很大,和内存是没有问题的,只要将整个文件读入一个字符串(ReadToEnd()方法),并使用字符串包含()
这会处理连续分割的情况吗? – 2010-01-21 15:51:41
下面是使用LINQ
快速简单的例子static void Main(string[] args)
{
{ //LINQ version
bool hasFoo = "file.txt".AsLines()
.Any(l => l.Contains("foo"));
}
{ // No LINQ or Extension Methods needed
bool hasFoo = false;
foreach (var line in Tools.AsLines("file.txt"))
if (line.Contains("foo"))
{
hasFoo = true;
break;
}
}
}
}
public static class Tools
{
public static IEnumerable<string> AsLines(this string filename)
{
using (var reader = new StreamReader(filename))
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
while (line.EndsWith("-") && !reader.EndOfStream)
line = line.Substring(0, line.Length - 1)
+ reader.ReadLine();
yield return line;
}
}
}
没有看到“已拆分”评论。您可以添加检查行中最后一个字符是否为 - 然后删除它并在检查单词 – 2010-01-21 15:38:53
之前将两行连接在一起注意:如果您使用的是.NET 4.0,则可以使用File.ReadLines(filename)必须编写AsLines方法。 – ICR 2010-01-23 05:18:20
@ICR:好点,我在2008年写作并测试了这个.Net 3.5。 – 2010-01-24 07:53:26
在这种情况下你不需要正则表达式。简单地循环播放,并检查它是否包含foo
。
using (StreamReader sr = File.Open("filename", FileMode.Open, FileAccess.Read))
{
string line = null;
while (!sr.EndOfStream) {
line = sr.ReadLine();
if (line.Contains("foo"))
{
// foo was found in the file
}
}
}
如果该行包含足球,该怎么办?还是傻瓜?如果你要走正则表达式路线,你需要寻找词边界。
Regex r = new Regex("\bfoo\b");
另外,如果需要,还要确保考虑不区分大小写。
这是一个很好的观点。使用我上面的示例,你可以在每行的开始和结尾添加空格,然后执行.Contains(“foo”) – 2010-01-21 15:53:50
你可以构造一个允许在每个字符之间放置换行符的正则表达式。
private static bool IsSubstring(string input, string substring)
{
string[] letters = new string[substring.Length];
for (int i = 0; i < substring.Length; i += 1)
{
letters[i] = substring[i].ToString();
}
string regex = @"\b" + string.Join(@"(\r?\n?)", letters) + @"\b";
return Regex.IsMatch(input, regex, RegexOptions.ExplicitCapture);
}
首先,这听起来像是作业;但是如果不是,这个词跨越两行时是否用连字符分开? – 2010-01-21 15:36:30
分割?你的意思是这个词可以连字符? http://en.wikipedia.org/wiki/Hyphen#Separating – 2010-01-21 15:36:59
By splitted我想说这个单词可以是两个linde:例如在行尾加上字母“f”,然后是字母“oo “在下一行的开始。而且,它不是功课。 – Toto 2010-01-21 15:48:09