Чернов Данил И-21

dpokatski 9c1751a445 lab11 10 months ago
lab1 1c21483e31 lab6 10 months ago
lab10 b8046db1ec lab10 10 months ago
lab11 9c1751a445 lab11 10 months ago
lab2 030b5c7a7d lab2 11 months ago
lab3 b095883763 lab3 11 months ago
lab4 ae1ca97f06 lab4 11 months ago
lab5 80dcdc3d8c lab5 11 months ago
lab6 1c21483e31 lab6 10 months ago
lab7 da1c3eed1e lab7 10 months ago
lab8 5e837b40c3 lab8 10 months ago
lab9 6a9dec995a lab9 10 months ago
readme.md 9c1751a445 lab11 10 months ago

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