Регулярные выражения
Практикум
Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания.
- Определите, содержится ли в сообщении заданное слово.
- Выведите все слова заданной длины.
- Выведите на экран все слова сообщения, записанные с заглавной буквы.
- Удалите из сообщения все однобуквенные слова.
- Удалите из сообщения все знаки препинания.
- Удалите из сообщения все русские слова.
- Удалите из сообщения только те русские слова, которые начинаются на гласную букву.
- Заменить все английские слова на многоточие.
- Найти максимальное целое число, встречающееся в сообщении.
- Найти сумму всех имеющихся в тексте чисел (целых и вещественных, причем вещественное число может быть записано в экспоненциальной форме).
- В сообщении могут встречаться номера телефонов, записанные в формате xx-xx-xx, xxx-xxx или xxx-xx-xx. Вывести все номера телефонов, которые содержатся в сообщении.
- В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд - целое число из диапазона от 1 до 31, мм - целое число из диапазона от 1 до 12, а гггг - целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Выведите на экран все даты, которые относятся к текущему году.
- В сообщении могут содержаться IP-адреса компьютеров в формате d.d.d.d, где d - целое число из диапазона от 0 до 255. Вывести все IP-адреса содержащиеся в тексте.
- В сообщении могут содержаться IP-адреса компьютеров в формате d.d.d.d, где d - целое число из диапазона от 0 до 255. Удалить из сообщения IP-адреса, в которых последнее число d начинается с заданной цифры (данная цифра вводится с клавиатуры).
- Выведите на экран все адреса web-сайтов, содержащиеся в сообщении.
- В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд - целое число из диапазона от 1 до 31, мм - целое число из диапазона от 1 до 12, а гггг - целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Замените каждую дату сообщения на дату следующего дня.
- В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд - целое число из диапазона от 1 до 31, мм - целое число из диапазона от 1 до 12, а гггг - целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Замените каждую дату в сообщении на дату предыдущего дня.
- В сообщении может содержаться время в формате чч:мм:сс. В заданном формате чч - целое число из диапазона от 00 до 24, мм и сс - целые числа из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Преобразуйте каждое время к формату чч:мм, применив правило округления до целого числа минут.
- В сообщении может содержаться время в формате чч:мм. В заданном формате чч - целое число из диапазона от 00 до 24, мм - целое число из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Увеличите время на n минут.
- В сообщении может содержаться время в формате чч:мм. В заданном формате чч - целое число из диапазона от 00 до 24, мм - целое число из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Уменьшите время на n часов.
Самостоятельная работа
Теоретический материал
Класс Group позволяет группировать соответствия на основе синтаксиса регулярных выражений и представлять результаты действия одного группирующего выражения. Группирующее выражение именует группу и задает регулярное выражение. Любой фрагмент строки, удовлетворяющий этому регулярному выражению, будет добавлен в группу. Например, группу ip можно задать следующим выражением:
@"(?<ip>(\d|\.)+)\s"
В данной записи ( ?) говорит о том, что начинает формироваться группа, <ip> определяет имя данной группы, а (\d|\.)+)\s определяет шаблон регулярного выражения, который будет связан с этой группой. Если при поиске фрагмент текста будет соответствовать данному шаблону, то этот фрагмент будет заноситься в группу ip.
Класс Match является производным от класса Group и имеет коллекцию Groups, которая содержит все группы, обнаруженные объектом Match. Создание и использование коллекции Groups и классов Group иллюстрируется следующим примером:
static void Main(string[] args) { string text = @"04:55:34 223.34.12.156 www.aaa.ru 04:59:55 213.134.112.56 www.bbb.cc.com 05:05:01 223.34.12.156 www.aaa.ru"; Regex theReg = new Regex(@"(?<time>(\d|\:)+)\s"+ @"(?<ip>(\d|\.)+)\s"+ @"(?<site>\S+)"); MatchCollection theMatches = theReg.Matches(text); foreach (Match theMatch in theMatches) { if (theMatch.Length != 0) { Console.WriteLine("\ntheMatch: {0}", theMatch.ToString()); //1 Console.WriteLine("time: {0}", theMatch.Groups["time"]); //2 Console.WriteLine("ip: {0}", theMatch.Groups["ip"]); //3 Console.WriteLine("site: {0}", theMatch.Groups["site"]); //4 } } }
В этом примере строка 1 целиком выводит фрагмент текста совпавший с регулярным выражением, а строки 2-4, то только тот текст, который был помещен в конкретную группу
Практическое задание
- Шаблоны регулярных выражений для групп time, ip и site записаны в упрощенном виде. Преобразуйте их к такому виду, чтобы они соответствовали ограничениям, накладываемым на формат времени, ip-адреса и адреса web-сайта.
- Используя дополнительную литературу и Интернет, более подробно изучите работу с классом Group и коллекцией Groups класса Match.