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*|, который выявляет целые положительные числа, с предпоследней позиции и поставить его в начало строки, то алгоритм замены будет работать иначе. Он слегка приоткроет структуру числовых данных.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.