Правильные (Regular) выражения и класс Regex. Операторы над компонентами регулярных выражений, страница 8

foreach (string group in ex.GetGroupNames())

Console.Write ("Group: " + group + ", ");

Он выведет?

Именованные группы позволяют обращаться к ним по имени для того, чтобы выявить результат поиска совпадений. Следующий фрагмент демонстрирует, как можно разделить адрес email на две части.

text = "some-one@example.company.com";

pattern = @"(?<user>[^@]+)@(?<host>.+)";

Regex ex = new Regex (pattern);

Match m = ex.Match (text);

if (m.Success)

{

Console.WriteLine (

"User: " + m.Groups["user"].Value +

"Host: " + m.Groups["host"].Value);

}

Он производит следующий вывод?

Если мы имеем именованную группу (?<name>...), то на нее можно сослаться с помощью выражения, имеющего следующий вид: \k<name>. Запустите нашу основную тестовую программу, используя следующие входные данные:

text = " some some error error text";

pattern = @"(?<word>\s\w+)\k<word>\b";

Здесь создана именованная группа (?<word>\s\w+), соответствующая произвольному слову, перед которым стоит разделитель из множества \s. За группой следует ссылка \k<word> на нее же. Следовательно шаблон можно использовать для поиска сдвоенных слов.

Тестовая программа с данными произведет следующий вывод? Объясните результат.

Мета-символ \b, который задает границу слова, позволяет избавиться от ошибочных срабатываний регулярного выражения в текстовых строках вида:

text = " the theory";

Редактирование текста

Предположим, что мы имеем не очень большой текстовый файл, в котором содержится список людей, и перед нами стоит задача проверить текст списка и скорректировать его формат. Изучив текст, мы видим, что он форматирован нерегулярно. Например:

Peter Pen, Age: 23, Group: 581/1

Pamela Robinson; Age| 22, Group. 582/1

Patricia Warren; Age, 22, Group. 583/2

Нарушена логика использования разделителей. Обратите внимание на то, что разделители слов во второй строке отличаются от тех, что использованы в первой. Обычно так бывает, когда текст файла вводится людьми, а не создается программным способом. Одним из самых простых способов редактирования файла будет замена всех типов разделителей на какой-нибудь один.

Следующий программный фрагмент справляется с этой задачей. Для замены символов разделителей из множества "[:.;|]" на строку из двух символов ", " он пользуется методом Replace класса Regex. Перед тем как применить метод мы создаем строку before, имитирующую текст списка, прочитанный из файла. Вставьте код, чтобы фрагмент заработал.

string[] ss =     // Список людей (имтация файла со списком)

{

"Peter Pen, Age: 23, Group: 581/1",

"Pamela Robinson; Age| 22, Group. 582/1",

"Patricia Warren; Age, 22, Group. 583/2"

};

string before="";

foreach (string s in ss) // Формирование входной строки

before += s + "\n";

Regex ex = new Regex (@"\s*[:.;|]\s*");

string after = ex.Replace                   // Замена разделителей Вставьте код.

Console.WriteLine (after);

Данный фрагмент выведет список?

Рассмотрим еще один сценарий использования метода Replace. Предположим, что вы имеете финансовый отчет и хотите передать его кому-либо, но не хотите раскрывать числовые данные, которые в нем содержатся. В этом случае можно создать новую версию отчета и заменить в ней все вхождения чисел на одну и ту же строку, например "##". Следующий пример демонстрирует один из способов решения этой задачи.

text = "Income: 222.22, Bank percent: 103, taxes -9.75 energy -44";

pattern = @"\s*\d+\.";   // Закончите его

Regex ex = new Regex (pattern);

string after = ex.Replace (text, " ## ");

Console.WriteLine (after);

Он должен произвести такой вывод.

Income: ## , Bank percent: ## , taxes ## energy ## .

Если переместить компонент шаблона \s*\d+\s*|, который выявляет целые положительные числа, с предпоследней позиции и поставить его в начало строки, то алгоритм замены будет работать иначе. Он слегка приоткроет структуру числовых данных.