Полностью забыли, как это сделать с помощью регулярного выражения - PullRequest
1 голос
/ 14 ноября 2011

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

Затем, когда есть совпадение, я хочу напечатать номер строки, за которым следует фактическое совпадение.

Итак:

string folderToSearch = @"C:\Projects\Unilever\Database";
string idsToMacthAsRegexp = "1943|3937";
DirectoryInfo dir = new DirectoryInfo(folderToSearch);
FileInfo[] filesToSearch = dir.GetFiles("*.sql", SearchOption.AllDirectories);

foreach (FileInfo f in filesToSearch)
{
    string line;

    using (StreamReader reader = new StreamReader(f.FullName))
    {
        while ((line = reader.ReadLine()) != null)
        {

            if (Regex.IsMatch(line, idsToMacthAsRegexp))
            {

                // I want to print the portion that matches but cant
                // even remember what this is called, or how to do it!

            }
        } 
    }
}

Console.ReadLine();

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Используйте метод Regex.Match вместо Regex.IsMatch.Это вернет объект Match, который позволит вам проверить свойство Success, а затем обратиться к соответствующему значению:

Match m = Regex.Match(line, idsToMacthAsRegexp);
if (m.Success)
{
    Console.WriteLine(m.Value);
}

Что касается номеров строк, которые не имеют ничего общего с регулярным выражением (если толькоэто то, что вы соответствуете, но это не похоже на ваш шаблон).Для этого, возможно, вы захотите объявить переменную-счетчик вне вашего цикла, установить ее в ноль и увеличивать ее при каждом проходе цикла (сразу после оператора while).

0 голосов
/ 14 ноября 2011

Особенно, если может быть больше соответствующего элемента или у вас есть группы:

  • Используйте Match вместо IsMatch
  • Просмотр Groups коллекции объекта совпадения
  • Используйте Index и Length, чтобы найти значение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...