Skip to content

Commit

Permalink
add Lab6 (regex)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexey-Sagaydak committed Apr 14, 2024
1 parent 803f7b8 commit cc34cda
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 9 deletions.
35 changes: 35 additions & 0 deletions Compiler/Models/Lab6/RegexExamples.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;

namespace Lab6;

public class RegexExamples
{
public static List<Match> ValidatePhoneNumber(string input)
{
string pattern = @"(?:\b\d{3}[-\s]?\d{2}[-\s]?\d{2}\b)";
Regex regex = new Regex(pattern);
return GetMatchesWithPositions(input, regex);
}

public static List<Match> ValidateFullName(string input)
{
string pattern = @"\b[А-ЯЁ][а-яё]*\s+[А-ЯЁ][а-яё]*\s+[А-ЯЁ][а-яё]*\b";
Regex regex = new Regex(pattern);
return GetMatchesWithPositions(input, regex);
}

public static List<Match> ValidateLatitude(string input)
{
string pattern = @"(?<!\d)[-]?(?:(?:0*[0-8]\d?)|(?:90))(?:\.\d+)?(?!\d)";
Regex regex = new Regex(pattern);
return GetMatchesWithPositions(input, regex);
}

private static List<Match> GetMatchesWithPositions(string input, Regex regex)
{
List<Match> matches = [.. regex.Matches(input).Cast<Match>()];
return matches;
}
}
44 changes: 44 additions & 0 deletions Compiler/ViewModels/MainWindowViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
using System.Collections.ObjectModel;
using System.Windows;
using Lab5;
using Lab6;
using Lab7;
using System.Linq.Expressions;
using System.Text.RegularExpressions;

namespace Compiler;

Expand Down Expand Up @@ -52,6 +54,9 @@ public class MainWindowViewModel : ViewModelBase
private RelayCommand _removeErrorsCommand;
private RelayCommand _parseWhileCommand;
private RelayCommand _calculateExprCommand;
private RelayCommand _reg1Command;
private RelayCommand _reg2Command;
private RelayCommand _reg3Command;

public event EventHandler<StringEventArgs> StringSent;
public event EventHandler<Lexeme> LexemeSent;
Expand Down Expand Up @@ -270,6 +275,45 @@ public RelayCommand RemoveErrorsCommand
get => _removeErrorsCommand ??= new RelayCommand(RemoveErrors);
}

public RelayCommand Reg1Command
{
get => _reg1Command ??= new RelayCommand(FindReg1);
}

public RelayCommand Reg2Command
{
get => _reg2Command ??= new RelayCommand(FindReg2);
}

public RelayCommand Reg3Command
{
get => _reg3Command ??= new RelayCommand(FindReg3);
}

public void FindReg1(object obj)
{
PrintRegResult(RegexExamples.ValidatePhoneNumber(_fileContent));
}

public void FindReg2(object obj)
{
PrintRegResult(RegexExamples.ValidateFullName(_fileContent));
}

public void FindReg3(object obj)
{
PrintRegResult(RegexExamples.ValidateLatitude(_fileContent));
}

private void PrintRegResult(List<Match> matches)
{
VMText = "";
foreach (Match match in matches)
{
VMText += $"Найдено: '{match.Value}', позиция: {match.Index}\n";
}
}

public void ParseWhile(object obj)
{
VMText = _whileParser.Parse(_whileLexer.Analyze(_fileContent));
Expand Down
18 changes: 9 additions & 9 deletions Compiler/Views/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -246,40 +246,40 @@
</Button>

<Button Grid.Column="0" Grid.Row="1" Margin="2 15 2 2" Grid.ColumnSpan="3" materialDesign:ElevationAssist.Elevation="Dp0" Focusable="False" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="ЛР №6: поиск подстрок с помощью регулярных выражений" Cursor="Arrow"/>
<Button Grid.Column="0" Grid.Row="2" Margin="2" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="Задание №1"/>
<Button Grid.Column="1" Grid.Row="2" Margin="2" Padding="5">
<Button Grid.Column="0" Grid.Row="2" Margin="2" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="Задание №1: российские номера городских телефонов" Command="{Binding Reg1Command}"/>
<Button Grid.Column="1" Grid.Row="2" Margin="2" Padding="5" Click="Button_Click_8">
<Button.ToolTip>
<ToolTip Content="Тестовый пример" />
</Button.ToolTip>
<materialDesign:PackIcon Kind="Code" />
</Button>
<Button Grid.Column="2" Grid.Row="2" Margin="2" Padding="5">
<Button Grid.Column="2" Grid.Row="2" Margin="2" Padding="5" Click="Button_Click_5">
<Button.ToolTip>
<ToolTip Content="Задание" />
</Button.ToolTip>
<materialDesign:PackIcon Kind="AboutCircleOutline" />
</Button>
<Button Grid.Column="0" Grid.Row="3" Margin="2" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="Задание №2"/>
<Button Grid.Column="1" Grid.Row="3" Margin="2" Padding="5">
<Button Grid.Column="0" Grid.Row="3" Margin="2" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="Задание №2: ФИО человека на русском языке" Command="{Binding Reg2Command}"/>
<Button Grid.Column="1" Grid.Row="3" Margin="2" Padding="5" Click="Button_Click_9">
<Button.ToolTip>
<ToolTip Content="Тестовый пример" />
</Button.ToolTip>
<materialDesign:PackIcon Kind="Code" />
</Button>
<Button Grid.Column="2" Grid.Row="3" Margin="2" Padding="5">
<Button Grid.Column="2" Grid.Row="3" Margin="2" Padding="5" Click="Button_Click_6">
<Button.ToolTip>
<ToolTip Content="Задание" />
</Button.ToolTip>
<materialDesign:PackIcon Kind="AboutCircleOutline" />
</Button>
<Button Grid.Column="0" Grid.Row="4" Margin="2" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="Задание №3"/>
<Button Grid.Column="1" Grid.Row="4" Margin="2" Padding="5">
<Button Grid.Column="0" Grid.Row="4" Margin="2" Padding="5" Background="WhiteSmoke" Foreground="Black" Content="Задание №3: широта с учетом корректных значений" Command="{Binding Reg3Command}"/>
<Button Grid.Column="1" Grid.Row="4" Margin="2" Padding="5" Click="Button_Click_10">
<Button.ToolTip>
<ToolTip Content="Тестовый пример" />
</Button.ToolTip>
<materialDesign:PackIcon Kind="Code" />
</Button>
<Button Grid.Column="2" Grid.Row="4" Margin="2" Padding="5">
<Button Grid.Column="2" Grid.Row="4" Margin="2" Padding="5" Click="Button_Click_7">
<Button.ToolTip>
<ToolTip Content="Задание" />
</Button.ToolTip>
Expand Down
48 changes: 48 additions & 0 deletions Compiler/Views/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,5 +257,53 @@ private void Button_Click_4(object sender, RoutedEventArgs e)
5 + 3 * 8 / -40
""";
}

private void Button_Click_5(object sender, RoutedEventArgs e)
{
MessageBox.Show("""
Построить РВ для валидации российских номеров городских телефонов (7 цифр, разделенных пробелами или символами -, без кода города).
""", "Задание", MessageBoxButton.OK, MessageBoxImage.Information);
}

private void Button_Click_6(object sender, RoutedEventArgs e)
{
MessageBox.Show("""
Построить РВ, описывающее ФИО человека на русском языке (фамилия, имя и отчество полностью).
""", "Задание", MessageBoxButton.OK, MessageBoxImage.Information);
}

private void Button_Click_7(object sender, RoutedEventArgs e)
{
MessageBox.Show("""
Построить РВ, описывающее широту (учесть диапазон корректных значений).
""", "Задание", MessageBoxButton.OK, MessageBoxImage.Information);
}

private void Button_Click_8(object sender, RoutedEventArgs e)
{
textEditor.Text = """
Профессор Иванов сидел за своим столом, разбирая старые записи.
На одной из бумажек он заметил номер телефона: 123 45 67.
"Интересно, чей это номер?" - подумал он.
Перебирая другие записи, он нашел еще несколько номеров: 888-99-00, 147-85-20.
Похоже, это номера его старых знакомых, которых он давно не видел.
""";
}

private void Button_Click_9(object sender, RoutedEventArgs e)
{
textEditor.Text = """
В библиотеке было тихо и спокойно. Иван Петрович Бунин сидел за столом и писал письмо своему другу
Алексею Максимовичу Пешкову, более известному как Максим Горький. Он описывал события прошедшей
недели и делился своими мыслями о новом романе Анны Андреевны Ахматовой.
""";
}

private void Button_Click_10(object sender, RoutedEventArgs e)
{
textEditor.Text = """
Координаты: -90, 0.5, 45, -10.23, 89.9, 100, -91.9
""";
}
}
}
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,32 @@ P = {

**Цель работы:** реализовать алгоритм поиска в тексте подстрок, соответствующих заданным регулярным выражениям.

## Задачи

1. (I.3) Построить РВ для валидации российских номеров городских телефонов (7 цифр, разделенных пробелами или символами -, без кода города).

```
(?:\b\d{3}[-\s]?\d{2}[-\s]?\d{2}\b)
```

![Тест](/README_images/reg_test_1.png)

2. (II.16) Построить РВ, описывающее ФИО человека на русском языке (фамилия, имя и отчество полностью).

```
\b[А-ЯЁ][а-яё]*\s+[А-ЯЁ][а-яё]*\s+[А-ЯЁ][а-яё]*\b
```

![Тест](/README_images/reg_test_2.png)

3. (III.17) Построить РВ, описывающее широту (учесть диапазон корректных значений).

```
(?<!\d)[-]?(?:(?:0*[0-8]\d?)|(?:90))(?:\.\d+)?(?!\d)
```

![Тест](/README_images/reg_test_3.png)

## Лабораторная работа №7: Реализация метода рекурсивного спуска для синтаксического анализа

**Тема:** реализация метода рекурсивного спуска для синтаксического анализа.
Expand Down
Binary file added README_images/reg_test_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added README_images/reg_test_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added README_images/reg_test_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit cc34cda

Please sign in to comment.