2010-01-21 49 views
0

我正在尋找一種方法來檢查使用C#的文本文件中是否存在「foo」單詞。C#查找單詞是否在文檔中

我可以使用一個正則表達式,但我不確定這是否會工作,如果這個詞分成兩行。我列舉了一個列舉過程的流式處理程序,也遇到了同樣的問題。

有何評論?

+0

首先,這聽起來像是作業;但是如果不是,這個詞跨越兩行時是否用連字符分開? – 2010-01-21 15:36:30

+0

分割?你的意思是這個詞可以連字符? http://en.wikipedia.org/wiki/Hyphen#Separating – 2010-01-21 15:36:59

+0

By splitted我想說這個單詞可以是兩個linde:例如在行尾加上字母「f」,然後是字母「oo 「在下一行的開始。而且,它不是功課。 – Toto 2010-01-21 15:48:09

回答

2

這裏雅去。所以我們在閱讀文件時看字符串,並跟蹤第一個單詞的最後一個單詞組合並檢查是否符合您的模式。

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(" ")); 
} 
+0

我也想過這個......但是如果你在文件中有「barf oogle」之類的東西,你會遇到問題。 – 2010-01-21 15:52:29

+0

爲什麼輸入文件在單詞中有剎車?其中「f」在一行上,「oo」是下一行的開頭? – 2010-01-21 16:05:50

+0

我真的不認爲foo是他真正在尋找的詞。我的觀點是,如果你做一個.Replace(「」,「」),它會把所有的單詞結合在一起。 – 2010-01-21 16:10:11

3

簡單搜索有什麼問題?

如果文件不是很大,和內存是沒有問題的,只要將整個文件讀入一個字符串(ReadToEnd()方法),並使用字符串包含()

+0

這會處理連續分割的情況嗎? – 2010-01-21 15:51:41

2

下面是使用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; 
      } 
    } 
} 
+0

沒有看到「已拆分」評論。您可以添加檢查行中最後一個字符是否爲 - 然後刪除它並在檢查單詞 – 2010-01-21 15:38:53

+0

之前將兩行連接在一起注意:如果您使用的是.NET 4.0,則可以使用File.ReadLines(filename)必須編寫AsLines方法。 – ICR 2010-01-23 05:18:20

+0

@ICR:好點,我在2008年寫作並測試了這個.Net 3.5。 – 2010-01-24 07:53:26

0

在這種情況下你不需要正則表達式。簡單地循環播放,並檢查它是否包含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 
     } 
    } 
} 
1

如果該行包含足球,該怎麼辦?還是傻瓜?如果你要走正則表達式路線,你需要尋找詞邊界。

Regex r = new Regex("\bfoo\b"); 

另外,如果需要,還要確保考慮不區分大小寫。

+0

這是一個很好的觀點。使用我上面的示例,你可以在每行的開始和結尾添加空格,然後執行.Contains(「foo」) – 2010-01-21 15:53:50

0

你可以構造一個允許在每個字符之間放置換行符的正則表達式。

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); 
} 
相關問題