C # Чтение строк из файла и поиск совпадений между начальной строкой и конечной строкой, отличающейся на один символ - PullRequest
0 голосов
/ 14 февраля 2011

Предположим, у меня есть текстовый файл со строками {ABAA, AAAA, ABZA, ABZZ и AAZZ}, и мое начальное слово - AAAA, а мое конечное слово - AAZZ.Мне нужно найти все слова между начальным и конечным словами, различающиеся на один символ;поэтому из приведенного примера мои результаты будут: AAAA, ABZZ и AAZZ.

В данный момент я занимаюсь созданием списка и построчным чтением файла и передачей его в список.

    // 1 Declare new List.
   List<string> lines = new List<string>();

    // 2
    // Use using StreamReader for disposing.
   using (StreamReader sr = new StreamReader(PATH))
    {
        // 3
        // Use while != null pattern for loop
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            // 4
            // Insert logic here.
            // ...
            // "line" is a line in the file. Add it to our List.
            lines.Add(line);
        }
    }

Мой вопрос: как мне найти строки, отличающиеся на один символ?Нужно ли разбивать строку, которую я прочитал из файла, на символы и сравнивать ее с начальной и конечной строками?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2011

Регулярные выражения очень хороши в поиске такого рода вещей, и .NET имеет отличную поддержку регулярных выражений.Сначала вам нужно определить регулярное выражение.Ваши требования немного расплывчаты, но в соответствии с вашим описанием, примерами данных и примерами результатов я предполагаю, что вы хотите сопоставить начальное слово и каждое слово, которое отличается от конечного слова ровно на один символ.Требуемое регулярное выражение:

\bAAAA\b|\bAAZ\w\b|\bAA\wZ\b|\bA\wZZ\b|\b\wAZZ\b

Позвольте мне разобрать это слева направо.

  • '\ b' означает «границу слова», которая может быть пробелом, фигурной скобкой или другим подобным несловарным символом.
  • «AAAA» - это ваше начальное слово, и оно будетбуквально совпадает
  • '\ b' означает «граница слова»
  • '|'означает «чередование», что по существу означает «соответствует выражению слева ИЛИ соответствует выражению справа» *
  • «\ b» означает «граница слова»
  • «AAZ \ w» - этопервая перестановка односимвольных отличий от вашего конечного слова.«\ w» означает «любой символ слова».
  • «\ b» означает «граница слова»
  • '\ bAA \ wZ \ b' - это вторая перестановка односимвольных отличий отваше конечное слово.
  • '\ bA \ wZZ \ b' - третья перестановка.
  • '\ b \ wAZZ \ b' - четвертая и последняя перестановка, которая также соответствует конечному слову.

См. http://www.regular -expressions.info / reference.html для определений "границы слова" и "символа слова".

Теперь окод:

using System;
using System.Text.RegularExpressions;

string pattern = @"\bAAAA\b|\bAAZ\w\b|\bAA\wZ\b|\bA\wZZ\b|\b\wAZZ\b";


// 1 Declare new List.
List<string> lines = new List<string>();

// 2
// Use using StreamReader for disposing.
using (StreamReader sr = new StreamReader(PATH))
{
    // 3
    // Use while != null pattern for loop
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        // 4
        if (Regex.IsMatch(line, pattern, RegexOptions.IgnoreCase))
        {
            // ...
            // "line" is a line in the file. Add it to our List.
            lines.Add(line);
        }
    }
}
0 голосов
/ 14 февраля 2011

Я не уверен во всех требованиях, но эта функция должна возвращать количество символов, совпадающих между двумя словами.

private int CheckWord(string startWord, string otherWord)
{
    List<char> start = new List<char>(startWord.ToArray());
    List<char> wordt = new List<char>(otherWord.ToArray());
    return start.Intersect(wordt).Count();
}

Этот вызов CheckWord ("start", "srart");возвращает 4. Сопоставьте это число с длиной строки, чтобы определить, насколько они различаются.

0 голосов
/ 14 февраля 2011
bool compareStrings(a, b): return a.Zip(b, (a,b) => { a, b }).Where(x => x.a != x.b).Take(2).Count() <= 1;
...