C # Найти, если слово находится в документе - PullRequest
0 голосов
/ 21 января 2010

Я ищу способ проверить, присутствует ли слово "foo" в текстовом файле с использованием C #.

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

Есть комментарии?

Ответы [ 6 ]

3 голосов
/ 21 января 2010

Что не так с простым поиском?

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

2 голосов
/ 21 января 2010

Вот, пожалуйста. Поэтому мы смотрим на строку, когда читаем файл, и отслеживаем комбо первого слова, последнее слово и проверяем, соответствует ли он вашему шаблону.

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(" "));
}
2 голосов
/ 21 января 2010

Вот быстрый быстрый пример использования 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;
            }
    }
}
1 голос
/ 21 января 2010

А что если в строке есть футбол? Или дурак? Если вы собираетесь идти по маршруту регулярного выражения, вам нужно искать границы слов.

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

Также убедитесь, что вы учитываете нечувствительность к регистру, если вам нужно.

0 голосов
/ 23 января 2010

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

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);
}
0 голосов
/ 21 января 2010

Вам не нужны регулярные выражения в таком простом случае. Просто зациклите строки и проверьте, содержит ли оно 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...