dpokatski 9c1751a445 lab11 il y a 8 mois
..
readme.md 9c1751a445 lab11 il y a 8 mois

readme.md

Lab 11. Регулярные выражения

Пример регулярки в С

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 (Номера автобусов):

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 (Сжатие бинарных последовательностей):

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 (Стрелки):

using System.Text.RegularExpressions;

Console.WriteLine("Введите стрелы: ");
string strel = Console.ReadLine();
string patt = @"(>>-->)|(<--<<)";

MatchCollection match = Regex.Matches(strel, patt);
        
Console.WriteLine("Количество стрел: " + match.Count);

Task 4 (Нумеролог):

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 (Перестановка):

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("Из одного имени нельзя получить другое.");
}