2010-01-21 2 views
0

Я ищу способ проверить, присутствует ли слово «foo» в текстовом файле с использованием C#.C# Найти, если слово находится в документе

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

Любые комментарии?

+0

Во-первых, это звучит как домашнее задание; но если это не так, слово делится с дефисом, когда оно охватывает две строки? –

+0

Разделенные? Вы имеете в виду, что это слово может быть перенесено? http://en.wikipedia.org/wiki/Hyphen#Separating –

+0

Разделившись, я хотел сказать, что это слово может быть на две липы: например, буква «f» в конце строки, а затем буквы «oo "в начале следующей строки. И nop, это не домашнее задание. – Toto

ответ

2

Здесь ya go. Итак, мы смотрим на строку, когда мы читаем файл, и мы отслеживаем первое слово «последнее слово» и проверяем, соответствует ли ваш шаблон.

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» в файле. –

+0

Зачем входной файл имеет тормоз в слове? где «f» находится на одной линии, а «оо» - начало следующего? –

+0

Ну, я действительно не думаю, что это слово, которое он действительно ищет. Я хотел сказать, что если вы сделаете .Replace ("", ""), он присоединится ко всем словам. –

3

Что случилось с простым поиском?

Если файл не велик, а память не проблема, просто прочитать весь файл в строку (ReadToEnd() метод), а также использование строки Содержит()

+0

будет ли это обрабатывать случай, когда он разделен на последовательные строки? –

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

не видел «расщепленного» комментария. вы можете добавить проверку, если последний символ в строке равен - затем удалите его и соедините две строки вместе, прежде чем вы проверите слово –

+0

. Примечание. Если вы используете .NET 4.0, вы можете использовать File.ReadLines (filename) вместо необходимости написать метод AsLines. – ICR

+0

@ICR: Хорошая мысль, я писал и тестировал это в 2008 году против .NET 3.5. –

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») –

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); 
} 
Смежные вопросы