# [Lab 11. Регулярные выражения](https://github.com/kolei/OAP/blob/master/articles/t5_regex.md) **Пример регулярки в С** ``` using System.Text.RegularExpressions; string s = "Бык тупогуб, тупогубенький бычок, у быка губа бела была тупа"; Regex regex = new Regex(@"туп(\w*)"); MatchCollection matches = regex.Matches(s); if (matches.Count > 0) { foreach (Match match in matches) Console.WriteLine(match.Value); } else { Console.WriteLine("Совпадений не найдено"); } ``` **Вывод:** ``` тупогуб тупогубенький тупа ``` **Поиск с группами** ``` using System.Text.RegularExpressions; string text = "One car red car blue car"; string pat = @"(\w+)\s+(car)"; Regex r = new Regex(pat, RegexOptions.IgnoreCase); Match m = r.Match(text); int matchCount = 0; // можно искать не одно вхождение, а несколько while (m.Success) { Console.WriteLine("Match"+ (++matchCount)); // тут можно было бы перебирать по длине массива Groups, // но мы по своему шаблону и так знаем, что у нас две подгруппы for (int i = 1; i <= 2; i++) { Console.WriteLine($"Group {i}='{m.Groups[i]}'"); } // поиск следующей подстроки соответсвующей шаблону m = m.NextMatch(); } ``` **Вывод:** ``` Match1 Group 1='One' Group 2='car' Match2 Group 1='red' Group 2='car' Match3 Group 1='blue' Group 2='car' ``` **Проверка на соответствие строки формату** ``` using System.Text.RegularExpressions; string pattern = @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$"; while (true) { Console.WriteLine("Введите адрес электронной почты"); string email = Console.ReadLine(); if (Regex.IsMatch(email, pattern, RegexOptions.IgnoreCase)) { Console.WriteLine("Email подтвержден"); break; } else { Console.WriteLine("Некорректный email"); } } ``` **Вывод:** ``` Введите адрес электронной почты archebalu2006@gmail.com Email подтвержден ``` **Замена и метод Replace** ``` string s = "Мама мыла раму. "; string pattern = @"\s+"; string target = " "; Regex regex = new Regex(pattern); string result = regex.Replace(s, target); ``` ## Задание на дом: **Лабораторную по теме "строки" реализовать через регулярки (где это возможно)** #### [Task 1 (Номера автобусов):](https://acmp.ru/index.asp?main=task&id_task=691) ``` using System.Text.RegularExpressions; string Jo = @"^[A-Z]{1}\d{3}[A-Z]{2}$"; Console.WriteLine("Введите регистрационные номера: "); string Car; do { Car = Console.ReadLine(); if (!string.IsNullOrEmpty(Car)) { if (Regex.IsMatch(Car, Jo)) { Console.WriteLine("Номер соответствует стандарту. "); } else { Console.WriteLine("Номер не соответствует стандарту. "); } } } while (!string.IsNullOrEmpty(Car)); ``` #### [Task 2 (Сжатие бинарных последовательностей):](https://acmp.ru/index.asp?main=task&id_task=950) ``` using System.Text.RegularExpressions; Console.WriteLine("Введите последовательность: "); string voi = Console.ReadLine(); string comp = CompressBinary(voi); string CompressBinary(string? s) { string comp = Regex.Replace(voi, "1+|0+", m => ((char)('a' + m.Value.Length - 1)).ToString()); return comp; } Console.WriteLine("Сжатая последовательность: " + comp); ``` #### [Task 3 (Стрелки):](https://acmp.ru/index.asp?main=task&id_task=44) ``` using System.Text.RegularExpressions; Console.WriteLine("Введите стрелы: "); string strel = Console.ReadLine(); string patt = @"(>>-->)|(<--<<)"; MatchCollection match = Regex.Matches(strel, patt); Console.WriteLine("Количество стрел: " + match.Count); ``` #### [Task 4 (Нумеролог):](https://acmp.ru/index.asp?main=task&id_task=95) ``` Console.WriteLine("Введите время жизни человека в секундах: "); string voi = Console.ReadLine(); int count = 0; while (voi.Length > 1) { int sum = voi.Sum(c => c - '0'); count++; Console.WriteLine($"Промежуточная сумма на шаге {count}: {sum}"); voi = sum.ToString(); } Console.WriteLine($"Количество операций: {count}"); Console.WriteLine($"Полученная цифра: {voi}"); ``` #### [Task 5 (Перестановка):](https://acmp.ru/index.asp?main=task&id_task=693) ``` using System.Text.RegularExpressions; Console.WriteLine("Введите два слова: "); string name1 = Console.ReadLine(); string name2 = Console.ReadLine(); name1 = Regex.Replace(name1.ToLower(), @"\s+", ""); name2 = Regex.Replace(name2.ToLower(), @"\s+", ""); char[] name1Chars = name1.ToCharArray(); Array.Sort(name1Chars); string sortedName1 = new string(name1Chars); char[] name2Chars = name2.ToCharArray(); Array.Sort(name2Chars); string sortedName2 = new string(name2Chars); if (sortedName1.Equals(sortedName2)) { Console.WriteLine("Из одного имени можно получить другое."); } else { Console.WriteLine("Из одного имени нельзя получить другое."); } ```