РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ: РЕШЕНИЕ ПРАКТИЧЕСКИХ ЗАДАЧ - Студенческий научный форум

IX Международная студенческая научная конференция Студенческий научный форум - 2017

РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ: РЕШЕНИЕ ПРАКТИЧЕСКИХ ЗАДАЧ

Черноусова Ю.А. 1
1Саратовский национальный исследовательский государственный университет имени Н.Г. Чернышевского
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
ВВЕДЕНИЕ

В последнее время с огромной скоростью развиваются информационные технологии, а также становятся популярными различные методы, способы, механизмы и инструменты, которые помогают оптимизировать работу программистов. Одним из таких методов, для обработки текстовой информации, являются регулярные выражения (от англ. Regular Expression). Регулярные выражения - формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. По сути это строка-образец (от англ. pattern, также ее называют «шаблоном» или «маской»), состоящая из обычных символов (их называют литералами) и метасимволов, задающая правило поиска.

Регулярные выражения произвели фурор в электронной обработке текстов в конце XX века, благодаря UNIX, которые поставляли набор утилит в своих дистрибутивах. Регулярные выражения поддерживаются многими языками программирования, такими как Java, Visual Basic, JavaScript, C, C++, C#, Python, Ruby, PHP и другими. В данной работе для решения практических задач с помощью регулярных выражение использован язык программирования C#.

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

Актуальность использования регулярных выражений и определило цель данной работы – изучение практических задач, решаемых с помощью регулярных выражений.

Задачи:

1. Изучить язык регулярных выражений для С# for .NET Framework

2. Рассмотреть механизм реализации регулярных выражений

3. Выделить классы задач, решаемые с помощью регулярных выражений

1 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ 1.1 Язык регулярных выражений языка C#

Классы String и StringBuilder, предназначеные для работы со строками, позволяют выполнять над ними различные операции, такие как: поиск, замена, вставка и удаление подстрок. Но есть и такие задачи по обработке символьной информации, где стандартных возможностей данных стандартных классов явно не достаточно. Чтобы облегчить решение таких задач, в пространстве имен System.Text.RegularExpressions определены классы Regex, Match и MatchCollection, которые представляют собой мощный инструмент для работы со строками, основанный на регулярных выражениях [1]. Главным преимуществом такого аппарата, как регулярные выражения, является возможность использования метасимволов.

Язык регулярных выражений состоит из символов двух видов: обычных символов и метасимволов.

Метасимволы - это специальные символы, которые задают команды, а также управляющие последовательности. Каждый из метасимволов имеет специальное назначение.

В таблице 1 представлены специальные метасимволы регулярных выражений C#, которые чаще всего используются.

Таблица 1. Метасимволы регулярных выражений

Символ

Значение

Пример

[…]

Любой символ из последовательности, указанной в скобках

Выражение p[ui]t соответствует фрагментам: put, pit.

Выражение p[a-c]t соответствует фрагментам: pat, pbt, pct.

[^…]

Любой символ из последовательности, не указанной в скобках.

Выражение p[^ui]t соответствует фрагментам: pat, pbt, p3t и т.д.

Выражение p[a-c]t соответствует фрагментам: pat, pbt, pct.

.

Любой символ, кроме перевода строки или другого разделителя Unicode-строки

Выражение p.t соответствует фрагментам:

pat, put, p#t, p]t и т.д.

w

Любой алфавитно-цифровой символ, а также символ пробел.

Выражение pwt соответствует фрагментам: pbt, pct, p2t, p_t и т.д., но не соответствует

фрагментам p%t, p{t и т.д.

W

Любой символ не удовлетворяющий w.

Выражение pWt соответствует фрагментам: p%t, p{t, p.t и т.д., но не соответствует фрагментам pbt, pct, p2t и т.д.

 

Любой пробельный символ (пробел, табуляция и переход на новую строку).

Выражение swwws соответствует любому

слову из трех букв, окруженному пробельными символами.

 

Любой не пробельный символ.

Выражение sSSSs соответствует любым

трем не пробельным символам, окруженным пробельными.

 

Любой пробельный символ (s), или начало/конец строки.

Выражение bwwwb соответствует любому

слову из трех букв, окруженному пробельными символами или началом/концом строки.

 

Любой символ, кроме удовлетворяющих b.

Выражение BdddB соответствует любым

трем цифрам, входящим в состав слова так, что ни справа, ни слева от них нет конца слова.

d

Любая десятичная цифра.

Выражение pdt соответствует фрагментам: p1t,

p2t, p3t и т.д.

D

Любой символ, не являющийся

десятичной цифрой.

Выражение pDt соответствует всем фрагментам, кроме: p1t,

p2t, p3t и т.д.

|

Соответствует логической операции «ИЛИ».

Выражение p[a-c]|[0-2] соответствует фрагментам:

pa, pb, pc, p0, p1, c2.

^

Фрагмент, совпадающий с

регулярными выражениями, следует искать только в начале строки.

Выражение ^pat определяет последовательность символов pat, расположенную в начале строки.

$

Фрагмент, совпадающий с

регулярными выражениями, следует

искать только в конце строки.

Выражение pat$ определяет последовательность символов pat, расположенную в конце строки.

В регулярных выражениях также используются повторители – это специальные метасимволы, которые располагаются сразу после обычного символа (группы символов) и задают количество его повторений в выражении [2].

Таблица 2. Таблица повторителей

Символ

Значение

Пример

*

Ноль или более повторений

предыдущего элемента.

Выражение pa*t соответствует фрагментам:

pt, pat, paat, paaat и т.д.

+

Одно или более повторений предшествующего шаблона.

Выражение pa+t соответствует фрагментам:

pat, paat, paaat и т.д.

?

Не более одного повторения

предыдущего шаблона.

Выражение pa?t соответствует фрагментам: pt, pat.

{n}

Ровно n повторений предыдущего шаблона.

Выражение pa{3}t соответствует фрагменту: pаааt.

{n,}

n и более повторений предыдущего шаблона.

Выражение pa{3,}t соответствует фрагментам: pаааt, paaaat, paaaaaaat и т.д.

{n,m}

От n до m повторений предыдущего шаблона.

Выражение pa{1,3}t соответствует фрагментам: cаt, caat, caaat.

Регулярное выражение на C# задается строковой константой. Это может быть обычная или @-константа. Чаще всего, следует использовать именно @-константу. Дело в том, что символ «» широко применяется в регулярных выражениях, как для записи управляющих последовательностей, так и в других ситуациях. Обычные константы в таких случаях будут выдавать синтаксическую ошибку, а @-константы не выдают ошибок и корректно интерпретируют запись регулярного выражения [3].

Для «разрезания» строк используются регулярные выражения, разделенные на несколько подгрупп, соответствующие различным компонентам запроса. Это называется «группирование», более подробно о нем указано в таблице 3.

Таблица 3. Таблица группирования

Обозначение

Описание

Пример

 

Разбивает выражение на группы. Для каждого подвыражения, заключенного в скобки, создается группа, получающая номер. Номера следуют в обратном порядке, поэтому всему выражению соответствует группа с номером 0.

Например, ((dd)(w)).

Будет создано 3 группы: 0 – для всего выражения, 1 – (dd), 2 – (w).

(?)

При обнаружении соответствия выражению, заданному в круглых скобках, создается именованная группа, которой дается имя Name.

Например,

(? d{7}).

При обнаружении последовательности из семи цифр будет создана группа с именем tel.

Простой пример записи регулярного выражения - формат записи целого числа со знаком или без знака: @"[+-]?d+".

Комбинация [+-]? означает, что в начале может стоять «+» или «-», а метасимвол «?» обеспечивает то, что предыдущий шаблон повторится не более одного раза.

Ниже представлены другие примеры регулярных выражений:

  1. Время в формате ЧЧ:ММ:СС:

@"([01]d|2[0-3])(:[0-5]d){2}$"

  1. MAC-адрес:

@"([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}"

  1. Номер телефона в формате +7xxx-xxx-xx-xx:

@"+7d{3}-d{3}(-dd){2}"

  1. Дата рождения в формате ДД.ММ.ГГГГ или ДД/ММ/ГГГГ:

@"(0[1-9] | [12][0-9] | [3][01]) [/.] (0[1-9] | 1[0-2]) [/.] (19|20)dd"

  1. Номер автомобиля в формате xYYYxx, где x – буква, y – цифра.

@"[АВЕКМНОРСТХУ]ddd[АВЕКМНОРСТХУ]{3}"

  1. Адрес электронной почты:

@"bw+([.w]+)*w@w((.w)*w+)*.w{2,3}b"

1.2 Механизм реализации регулярных выражений

В пространстве имен System.Text.RegularExpressions платформы Microsoft .NET Framework содержатся такие классы, как:

  • Regex – постоянное регулярное выражение;

  • Math – результаты применения регулярного выражения к заданной строке;

  • MathCollection – набор успешных сопоставлений;

  • Group – результаты для одной регулярной группы;

  • GroupCollection – коллекция найденных групп;

Класс Regex – это основной класс, который всегда создается программистом при работе с регулярными выражениями. Объекты этого класса определяют регулярные выражения. Конструктор класса перегружен. В простейшем варианте ему передается в качестве параметра строка, задающая регулярное выражение [4].

Инициализация регулярного выражения может выглядеть таким образом:

Regex regex = new Regex(@"d{3}");

Основные методы класса Regex:

  1. IsMatch – метод, реализующий поиск фрагмента, заданного регулярным выражением в строке. Возвращает true или false, в зависимости от того был найден заданный фрагмент или нет.

  2. Math – метод, запускающий поиск соответствия. В качестве параметра ему передается строка, где происходит поиск первой подстроки, которая удовлетворяет образцу, заданному регулярным выражением. В качестве результата метод возвращает объект класса Match, описывающий результат поиска.

  3. Matches – метод, позволяющий разыскать все вхождения (все подстроки), которые удовлетворяют образцу. У алгоритма поиска есть важная особенность - разыскиваются непересекающиеся вхождения подстрок. Можно считать, что метод Matches многократно запускает метод Match, каждый раз начиная поиск с того места, на котором закончился предыдущий поиск. В качестве результата возвращается объект MatchCollection, представляющий коллекцию объектов Match.

  4. NextMatch – метод, запускающий новый поиск, начиная с того места, где остановился предыдущий.

  5. Replace– заменяет каждую подстроку, соответствующую шаблону регулярного выражения, на указанную строку или шаблон регулярного выражения и возвращает всю замененную входную строку [5].

  6. Split - является обобщением метода Split класса String. Он позволяет, используя строку-образец, разделить искомую строку на элементы. Поскольку образец может быть устроен сложнее, чем простое множество разделителей, то метод Split класса Regex эффективнее, чем его аналог класса String [6].

У класса Regex есть несколько перегрузок конструктора для описания регулярного выражения:

  1. Regex(String) - создает регулярное выражение на основе строкового литерала;

  2. Regex (String, RegexOptions) - создает регулярное выражение на основе строкового литерала и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать или нет прописные и строчные буквы)[7].

Можно заметить, что при работе с регулярными выражениями приходится создавать один объект класса Regex, объекты других классов автоматически появляются в процессе работы с объектами Regex [8].

Рассмотрим несколько примеров с использованием класса Regex.

Пример 1. Использованиеметода IsMatch.

static void Main(string[] args)

{

Regex regex =

new Regex("кот|пёс", RegexOptions.IgnoreCase);

string str1 = "Кот и пёсик сидели на крыше";

string str2 =

"По телевизору показывали мультик "Котопёс"";

Console.WriteLine(regex.IsMatch(str1));

Console.WriteLine(regex.IsMatch(str2));

}

Результат:

True

True

В примере 1 в качестве второго параметра конструктора использован RegexOptions.IgnoreCase, который означает, что регулярное выражение применяется без учета регистра символов. Как мы видим, в str2 наша программа также нашла совпадение «кот» или «пёс» в слове «Котопёс», чтобы этого избежать, немного модернизируем нашу программу:

static void Main(string[] args)

{

Regex regex = new Regex(@"bкотb|bпёсb",

RegexOptions.IgnoreCase);

string str1 = "Кот и пёсик сидели на крыше";

string str2 =

"По телевизору шел мультик "Котопёс"";

Console.WriteLine(regex.IsMatch(str1));

Console.WriteLine(regex.IsMatch(str2));

}

Результат:

True

False

Можно заметить, что данное регулярное выражения будет исключать слова, в которые входят наши искомые подстроки и будет искать только искомые подстроки, ограниченные проблем, началом строки, концом строки или другими разделителями[9].

Класс Match предоставляет собой все сопоставления, которые найдены механизмом регулярных выражений, в таком порядке, в котором они содержатся в исходной строке. Объекты класса Match автоматически создаются при вызове функций Match и Matches. Коллекция MatchCollection позволяет получить доступ к каждому элементу данной коллекции - объекту Match.

Можно отметить, что класс Match является непосредственным наследником класса Group.

При работе с объектами класса Match нужно обратить более пристальное внимание на его свойства, нежели на методы, которые в нем реализованы. Большая часть свойств класса Match унаследована от родительских классов.

Свойства Index, Length и Value описывают найденную подстроку – возвращают соответственно индекс начала подстроки в заданной строке, длину подстроки и ее значение.

Свойство Groups класса Match возвращает коллекцию групп – объект класса GroupCollection, позволяющий работать с группами, созданными в процессе поиска соответствия [10].

СвойствоSuccessкласса Matchвозвращает истину, если строка содержит искомый фрагмент, в противном случае – ложь.

Рассмотрим несложные примеры использования класса Match и его свойств.

Пример 2. Использование метода Match и Replace класса Regex.

Дан текст, в котором описано значение курса доллара. Нужно вывести это значение, потом заменить его на другое и вывести строку с измененным курсом.

static void Main(string[] args)

{

string text = "Сегодня курс доллара составляет 71.87$.";

Regex regex = new Regex(@"sd+.d+$");

string replacement = " 71.65$";

Match match = regex.Match(text);

while (match.Success)

{

text = regex.Replace(text, replacement);

Console.WriteLine(match.Value);

match = match.NextMatch();

}

Console.WriteLine(text);

}

Результат:

71.87$

Сегодня курс доллара составляет 71.65$.

Важно также заметить, что в регулярном выражении @"sd+.d+$», использованном в примере, для обозначения символа точки используется специальное обозначение «.». Так как в регулярном языке C# есть такие служебные символы, как “$” и “.”, то чтобы указать их как обычные символы, нужно ставить слеш перед ними. Для не служебных символов, указывать слеш не нужно.

Пример 3. Использование метода Matches.

Напомним, что метод Matches возвращает объект класса MatchCollection, то есть набор всех фрагментов, которые совпадают с заданным регулярным выражением. Важно знать, что полученный объект доступен только для чтения.

Допустим, нам нужно вывести все слова из строки, а также их позиции.

public static void Main()

{

string input = "На столе был вишневый пирог.";

string pattern = @"b(w+)b";

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)

Console.WriteLine("'{0}' занимает позицию {1}.",

match.Value, match.Index);

}

Результат:

‘На’ занимает позицию 0.

‘столе’ занимает позицию 3.

‘был’ занимает позицию 9.

‘вишневый’ занимает позицию 13

‘пирог’ занимает позицию 22.

Пример 4. Использование группирования.

Входная строка содержит в себе сотовый телефон в формате +7xxxxxxxxxx и имя. Нам нужно выделить из строки все сгруппированные контакты и вывести их на консоль.

static void Main(string[] args)

{

string input = "+79173256465 Алексей, +79256477392 Иван,

+79023747551 Кирилл.";

string pattern =

@"(?+7d{10})s(?[A-Z|А-Я|a-z|а-я]+)";

Regex regex = new Regex(pattern);

Match match = regex.Match(input);

while (match.Success)

{

Group groupTel = match.Groups["tel"];

Group groupName= match.Groups["name"];

System.Console.WriteLine(

"Tel: " + groupTel +" Name: " + groupName);

match = match.NextMatch();

}

}

После выполнения программы на консоль было выведено:

Tel: +79173256465 Name: Алексей

Tel: +79256477392 Name: Иван

Tel: +79023747551 Name: Кирилл

2 ПРИМЕНЕНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ НА ПРАКТИКЕ 2.1 Постановка задачи

Создать абстрактный класс Телефонный_справочник с методами, позволяющими вывести на экран информацию о записях в телефонном справочнике, а также определить соответствие записи критерию поиска.

Создать производные классы со своими методами вывода информации на экран, и определения соответствия искомому типу:

  • Персона (фамилия, адрес, номер телефона);

  • Организация (название, адрес, телефон, факс, контактное лицо);

  • Друг (фамилия, адрес, номер телефона, дата рождения)

Создать базу из N записей, вывести полную информацию из базы на экран, а также организовать поиск в базе по фамилии и по номеру телефона.

Организовать валидацию полей для форм ввода информации с помощью регулярных выражений.

2.2 Описание приложения

Приложение было написано на языке C#. Для визуализации информации использована технология Windows Form. Ниже представлена структура программы, которая реализует трехуровневую архитектуру, состоящую из слоя клиента, слоя логики и слоя данных. На рисунке 1 представлены основные компоненты программы.

Рисунок 1. Структура приложения

Класс Phone – абстрактный класс, который наследует стандартный интерфейс IComparable. От данного класса наследуются классы Person и Organization, а от класса Person – Friend. Содержание классов из слоя данных приведено в Приложении А, из слоя логики – в Приложении Б, из слоя клиента – в Приложении В.

Информация о контактах берется из файла. Содержание входного файла представлено в Приложении А. После произведенных изменений с телефонным справочником можно сохранить информацию, и при следующем запуске программы можно работать с сохраненным файлом без потери измененной информации.

На рисунке ниже представлено окно, появляющееся при запуске программы:

При нажатии на пункт меню «Вывод» появляется следующий список предлагаемых действий:

При нажатии, например, на пункт выпадающего меню «Все» в таблицу будет выведена информация обо всех контактах во входном файле.

Элемент DataGridView (таблица), который расположен на форме, позволяет сортировать элементы списка по любому полю по возрастанию или убыванию значения.

Рассмотрим поиск контактов. В программе реализовано три вида поиска: по фамилии, по номеру телефона и по префиксу. При поиске по номеру телефона можно произвести удаление найденного контакта. Стоит заметить, что при поиске по фамилии такая опция, как удаление, отсутствует, так как найденных контактов может быть несколько.

Поиск по номеру телефона:

Поиск по фамилии осуществляется независимо от регистра, например:

В приложении также реализован поиск по префиксу, подробнее о его реализации рассказано в параграфе 2.3.

В приложении реализован поиск контактов по телефонному префиксу. К примеру, в телефоне 89021346576 префиксом является «902».

Рассмотрим ввод информации. При нажатии пункта меню «Ввод» появляется выпадающее меню, которое состоит из пунктов: «Персона», «Организации», «Друг». При выборе ввода, например, организации, появляется следующее окно:

Программа предусматривает многие ошибки пользователя. Например, если пользователь захочет добавить персону или друга со всеми пустыми полями, то при нажатии кнопки «ОК» будет выведена следующая ошибка:

Если пользователь не введет название организации, то также выведется сообщение с ошибкой о том, что поле «Название организации» обязательно для заполнения.

При добавлении всех категорий контактов проводится валидация всех полей, кроме адреса, поскольку адрес может состоять из любых символов, и подобрать для него «шаблон» почти невозможно. О валидации полей подробнее рассказано в следующем параграфе 2.3.

2.3 Задачи, решаемые с помощью регулярных выражений

В данной работе будут рассмотрены два класса задач, реализованных с помощью регулярных выражений – валидация полей форм и поиск данных.

2.3.1 Валидация полей форм

В представленной программе регулярные выражения использовались для валидации полей форм. Валидация данных – это проверка данных на соответствие определенным стандартам. В приложении «Телефонный справочник» валидация проводится при вводе данных.

При вводе всех категорий, присутствующих в программе проверяется поле «Фамилия» на то, чтобы фамилия могла состоять только из букв, между которыми может быть расположено тире, это учитывает двойные фамилии. В классе FormInput, наследуемого от класса Form, была написана функция для проверки формата фамилии, представленная ниже:

private bool CheckSurname(string text)

{

//Проверка для двойной фамилии

Regex reg1 = new Regex(@"^[А-Яа-яёЁA-Za-z]+-[А-Яа-яёЁA-Za-z]+$");

//Проверка для обычной фамилии

Regex reg2 = new Regex(@"^[А-Яа-яёЁA-Za-z]+$");

if (reg1.IsMatch(text) || reg2.IsMatch(text))

return true;

else

return false;

}

Метасимволы «^» и «$» означают, что искомый шаблон должен занимать всю строку от начала до конца. В квадратных скобках указаны последовательности букв, которые включают в себя нижний и верхний регистры русских и латинских букв. После квадратных скобок следует метасимвол «+», который означает, что таких символов может быть более одного.

Регулярное выражение для валидация поля имени и отчества довольно проста, так как имя и отчество может состоять только из букв.

private bool CheckNameAndPatr(string text)

{

Regex reg = new Regex(@"^[А-Яа-яёЁA-Za-z]+$");

if (reg.IsMatch(text) || text == "")

return true;

else return false;

}

Рассмотрим проверку поля «Телефон». Допустим, будем считать верными следующие форматы номера телефона:

  • +7xxxxxxxxxx

  • 8xxxxxxxxxx

  • xxxxxx

private bool CheckTel(string text)

{

//Проверка для мобильного телефона

Regex reg1 = new Regex(@"^(+7|8)d{10}$");

//Проверка для шестизначного телефона

Regex reg2 = new Regex(@"^d{6}$");

if (reg1.IsMatch(text) || reg2.IsMatch(text))

return true;

else

return false;

}

Если пользователь введет телефон в неверном формате, то будет выведена следующая ошибка:

Валидация поля «День рождение» происходит несколько сложнее, так как здесь использованы группирования. Дата должна быть написана в формате ДД.ММ.ГГГГ.

private bool CheckBirthday(string text)

{

Regex reg = new Regex(@"^(?0[1-9]|[12][0-9]|3[01]).

(?0[1-9]|1[012]).(?(19|20)dd)$");

Match match = reg.Match(text);

if (text == "")

return true;

if(match.Success)

{

Group groupDay = match.Groups["day"];

Group groupMonth = match.Groups["month"];

Group groupYear = match.Groups["year"];

if (groupMonth.Value == "02")

{

if (groupDay.Value == "29")

if (int.Parse(groupYear.Value) % 4 != 0 &&

int.Parse(groupYear.Value) % 100 != 0 &&

int.Parse(groupYear.Value) % 400 != 0)

return false;

if (groupDay.Value == "31" || groupDay.Value == "30")

return false;

}

return true;

}

return false;

}

Стоит заметить, что в данном регулярном выражении использовано группирование, например (?0[1-9]|[12][0-9]|3[01]) означает, что будет создана группа с именем «day». Данное регулярное выражение определяет, что:

  • если первая цифра – 0, то следующая цифра может быть от 1 до 9;

  • если первая цифры – 1 или 2, то следующая цифра может быть от 0 до 9;

  • если первая цифра – 3, то после нее могут стоять только 0 и 1.

Аналогичным образом проверяется формат ввода месяца и года.

В данном методе проводится проверка на високосный год. Если введено 29 февраля, а год не является високосным, то выведется сообщение об ошибке. Также ошибка будет выведена, если введено 30 или 31 февраля.

К примеру, при введении даты в таком формате, как на рисунке выше, будет выведена ошибка:

2.3.2 Поиск данных

В приложении с помощью регулярных выражений также реализован поиск контактов по телефонному префиксу. К примеру, в телефоне 89021346576 префиксом является «902».

Результат поиска:

Поиск выполняется с помощью метода, который находится в слое данных, в классе DataPhone. Данный метод возвращает список найденных значений, который впоследствии выводится в таблицу. Поиск реализован с помощью регулярного выражения, которое содержит префикс, введенный пользователем.

public List SearchToPrefList(string pref)

{

string pattern = @"^(+7|8)"+ pref + @"d{7}$";

Regex regex = new Regex(pattern);

List tempList = new List();

for (int i = 0; i < phoneBook.Count; i++)

{

if (regex.IsMatch(phoneBook[i].tel))

{

tempList.Add(phoneBook[i]);

}

}

return tempList;

}

ЗАКЛЮЧЕНИЕ

В заключении можно отметить, что регулярные выражения – очень полезный механизм для работы с текстом, который довольно часто используется на практике. По ходу выполнения курсовой работы было написано приложение «Телефонный справочник» на языке программирования C#.

Выполнены все поставленные задачи: изучен язык регулярных выражений для C# for .NET Fraemwork, рассмотрен механизм регулярных выражений. В приложении «Телефонный справочник» были рассмотрены и реализованы два классы задач, решаемые с помощью регулярных выражений – валидация полей форм, а также поиск данных с помощью регулярных выражений.

Данную разработку можно модернизировать в будущем для создания, к примеру, телефонного справочника, который работает с базами данных SQL, вместо текстового файла.

ИСПОЛЬЗУЕМЫЕ ИСТОЧНИКИ
  1. Гойвертс Ян. Регулярные выражения. Сборник рецептов/Ян Гойвертс, Стивен Левитан – СПб.: O`Reilly, 2010.

  2. Кудрина, Е.В. Программирование в среде Visual Studio .Net: разработка приложений на языке C#/ Е.В. Кудрина, М.В. Огнева. – Саратов: Издательство «КУБиК», 2010.

  3. Купаев М.Н. Технология Клиент-Сервер. – 2001.

  4. Фридл Джеффри. Регулярные выражения, 3-е изд. – СПб-М.: Символ-Плюс, 2008.

  5. Дистанционный курс «Структуры и алгоритмы компьютерной обработки данных» [Электронный ресурс]. URL: http://school.sgu.ru/course/view.php?id=29 (дата обращения: 10.04.2016)

  6. НОУ ИНТУИТ. Лекция «Регулярные выражения». [Электронный ресурс]. URL: http://www.intuit.ru/studies/courses/2247/18/lecture/568 (дата обращения: 17.04.2016)

  7. Регулярные выражения в .NET Framework. [Электронный ресурс]. URL: https://msdn.microsoft.com/ru-ru/library/hs600312(v=vs.110).aspx (дата обращения: 17.04.2016)

  8. Руководство C#. Регулярные выражения. [Электронный ресурс]. URL: http://professorweb.ru/my/csharp/charp_theory/level4/4_10.php (дата обращения: 17.04.2016)

  9. Регулярные выражения в C#. [Электронный ресурс]. URL: http://brtrg.by/blog/post/252 (дата обращения: 02.05.2016)

  10. Примеры регулярных выражений на C#. [Электронный ресурс]. URL: http://skillcoding.com/Default.aspx?id=155 (дата обращения: 02.05.2016)

  11. Regular Expressions. Quick Start. [Электронный ресурс]. URL: http://www.regular-expressions.info/quickstart.html (дата обращения: 02.05.2016)

ПРИЛОЖЕНИЕ А

Пример входного файла input.txt:

Персона|Иванов|Иван|Иванович|Московская 15,22|89023465761

Друг|Петров|Петр|Петрович|Чапаева 17,200|89256475821|30.02.95

Организация|ИП|Рабочая, 13|455555|Максимов|Максим|Максимович

Организация|СГУ|Рабочая, 12|435643|Иванов|Николай|Петрович

Персона|Михалков|Михаил|Петрович|Московская 20,100|89021346576

Содержимое класса Phone.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Phonebook.Files

{

public abstract class Phone : IComparable

{

public string tel;

public string address;

public string surname;

public string name;

public string patr;

public string category;

abstract public string ToOut();

abstract public string GetTitle();

abstract public string GetBirthday();

abstract public string GetSurname();

abstract public string GetName();

abstract public string GetPatr();

abstract public string GetTel();

public int CompareTo(object obj) //Для сортировки

{

{

Phone b = (Phone)obj;

if (String.Compare(this.surname, b.surname) == 0)

{

return 0;

}

else

{

if (String.Compare(this.surname, b.surname) > 0)

{

return 1;

}

else

{

return -1;

}

}

}

}

}

}

Содержимое класса Person.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Phonebook.Files

{

public class Person : Phone

{

public Person(string surname, string name, string patr, string address,

string tel)

{

this.surname = surname;

this.name = name;

this.patr = patr;

this.tel = tel;

this.address = address;

this.category = "Персона";

}

//Преобразование в текст для вывода в файл

public override string ToOut()

{

return String.Format("{0}|{1}|{2}|{3}|{4}|{5}", category, surname,

name, patr, address, tel);

}

public override string GetTitle()

{

return null;

}

public override string GetBirthday()

{

return null;

}

public override string GetSurname()

{

return surname;

}

override public string GetName()

{

return name;

}

override public string GetPatr()

{

return patr;

}

override public string GetTel()

{

return tel;

}

}

}

Содержимоекласса Organization.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Phonebook.Files

{

public class Organization : Phone

{

public string title;

public Organization(string title, string address, string tel,

string surname, string name, string patr)

{

this.title = title;

this.address = address;

this.tel = tel;

this.name = name;

this.patr = patr;

this.surname = surname;

this.category = "Организация";

}

//Преобразование в текст для вывода в файл

public override string ToOut()

{

return String.Format("{0}|{1}|{2}|{3}|{4}|{5}|{6}", category,

title, address, tel, surname, name, patr);

}

public override string GetTitle()

{

return title;

}

public override string GetBirthday()

{

return null;

}

public override string GetSurname()

{

return surname;

}

override public string GetName()

{

return name;

}

override public string GetPatr()

{

return patr;

}

override public string GetTel()

{

return tel;

}

}

}

Содержимоекласса Friend.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Phonebook.Files

{

public class Friend : Person

{

public string birthday;

public Friend(string surname, string name, string patr, string address,

string tel, string birthday)

: base(surname, name, patr, address, tel)

{

this.birthday = birthday;

this.category = "Друг";

}

//Преобразование в текст для вывода в файл

public override string ToOut()

{

return String.Format("{0}|{1}|{2}|{3}|{4}|{5}|{6}", category,

surname, name, patr, address, tel, birthday);

}

public override string GetBirthday()

{

return birthday;

}

public override string GetSurname()

{

return surname;

}

override public string GetName()

{

return name;

}

override public string GetPatr()

{

return patr;

}

override public string GetTel()

{

return tel;

}

}

}

Содержимоекласса DataPhone.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Phonebook.Files;

using System.Text.RegularExpressions;

namespace Phonebook.Data

{

public class DataPhone //Слой данных

{

private List phoneBook = new List(); //список контактов

public string categ;

//Добавление персоны

public void Add(string surname, string name, string patr,

string addr,string tel)

{

phoneBook.Add(new Person(surname, name, patr, addr, tel));

}

//Добавление друга или организации

public void Add(string categ, string surname, string name, string patr,

string addr, string tel, string birthdayOrTitle)

{

if (categ == "Друг")

phoneBook.Add(new Friend(surname, name, patr, addr, tel,

birthdayOrTitle));

else

if (categ == "Организация")

phoneBook.Add(new Organization(birthdayOrTitle, addr, tel,

surname, name, patr));

}

//Поиск по номеру телефона

public Phone SearchToTel(string tel)

{

for (int i = 0; i < phoneBook.Count; i++ )

{

if (phoneBook[i].tel == tel)

{

return phoneBook[i];

}

}

return null;

}

//Вывод списка контактов по фамилии

public List SearchToSurList(string surname)

{

List tempList = new List();

for (int i = 0; i < phoneBook.Count; i++)

{

if (String.Compare(phoneBook[i].surname, surname, true) == 0)

{

tempList.Add(phoneBook[i]);

}

}

return tempList;

}

//Вывод списка контактов по префиксу

public List SearchToPrefList(string pref)

{

string pattern = @"^(+7|8)"+ pref + @"d{7}$";

Regex regex = new Regex(pattern);

List tempList = new List();

for (int i = 0; i < phoneBook.Count; i++)

{

if (regex.IsMatch(phoneBook[i].tel))

{

tempList.Add(phoneBook[i]);

}

}

return tempList;

}

public IEnumerable GetAll()

{

return phoneBook.ToList();

}

public int Count()

{

return phoneBook.Count;

}

public void DeletePhone(int i)

{

phoneBook.RemoveAt(i);

}

public void DeletePhone1(Phone ph)

{

phoneBook.Remove(ph);

}

//Преобразовать контакт в текст формата файла

public string GetText(int i )

{

return phoneBook[i].ToOut();

}

}

}

ПРИЛОЖЕНИЕ Б

Содержимое класса LogicPhone.cs:

using System;

using System.Collections.Generic;

using Phonebook.Files;

using Phonebook.Data;

namespace Phonebook.Logic

{

public class LogicPhone //Словй логики

{

private DataPhone data = new DataPhone();

public void Add(string surname, string name, string patr,

string addr, string tel) //Person

{

data.Add(surname, name, patr, addr, tel);

}

public void Add(string categ, string surname, string name, string patr, string addr, string tel, string birthdayOrTitle)

{

data.Add(categ, surname, name, patr, addr, tel, birthdayOrTitle);

}

//Возвращает найденный контакт или null, если не найден

public Phone SearchToTel(string tel)

{

return data.SearchToTel(tel);

}

//Возвращает список найденных контактов по фамилии

public List SearchToSurList(string surname) {

return data.SearchToSurList(surname);

}

//Возвращает список найденных контактов по префиксу

public List SearchToPrefList(string pref)

{

return data.SearchToPrefList(pref);

}

public IEnumerable GetAll()

{

return data.GetAll();

}

public int Count()

{

return data.Count();

}

public void DeletePhone1(Phone ph)

{

data.DeletePhone1(ph);

}

public string GetText(int i)

{

return data.GetText(i);

}

}

}

ПРИЛОЖЕНИЕ В

Содержаниекласса Form1.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.IO;

using Phonebook.Logic;

using Phonebook.Files;

namespace Phonebook.UI

{

public partial class Form1 : Form

{

public LogicPhone log = new LogicPhone();

int countInTable;

bool flagOut;

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

countInTable = 0;

flagOut = true;

char[] c = { '|' };

StreamReader fileIn = new StreamReader("input.txt");

string line;

while ((line = fileIn.ReadLine()) != null)

{

string[] mas = line.Split(c);

if (mas[0] == "Персона")

{

log.Add(mas[1], mas[2], mas[3], mas[4], mas[5]);

}

else

if (mas[0] == "Организация")

{

log.Add(mas[0], mas[4], mas[5], mas[6], mas[2],

mas[3],mas[1]);

}

else

if (mas[0] == "Друг")

{

log.Add(mas[0], mas[1], mas[2], mas[3], mas[4],

mas[5], mas[6]);

}

}

fileIn.Close();

}

//Вывод всех контактов в таблицу

private void AllToolStripMenuOut_Click(object sender, EventArgs e)

{

while (dataGridView1.Rows.Count != 0)

dataGridView1.Rows.Remove(

dataGridView1.Rows[dataGridView1.Rows.Count - 1]);

flagOut = true;

var phones = log.GetAll();

int i = 0;

foreach (var phone in phones)

{

if (flagOut)

{

this.dataGridView1.Rows.Add();

}

this.dataGridView1.Rows[i].Cells[0].Value = phone.category;

this.dataGridView1.Rows[i].Cells[1].Value = phone.surname;

this.dataGridView1.Rows[i].Cells[2].Value = phone.name;

this.dataGridView1.Rows[i].Cells[3].Value = phone.patr;

this.dataGridView1.Rows[i].Cells[5].Value = phone.tel;

this.dataGridView1.Rows[i].Cells[7].Value = phone.address;

if (phone.category == "Организация")

this.dataGridView1.Rows[i].Cells[4].Value =

phone.GetTitle();

if (phone.category == "Друг")

this.dataGridView1.Rows[i].Cells[6].Value =

phone.GetBirthday();

countInTable++;

i++;

}

flagOut = false;

}

//Вывод всех персон в таблицу

private void AllPerToolStripMenuOut_Click(object sender, EventArgs e)

{

while (dataGridView1.Rows.Count != 0)

dataGridView1.Rows.Remove(

dataGridView1.Rows[dataGridView1.Rows.Count - 1]);

flagOut = true;

int j = 0;

var phones = log.GetAll();

foreach (var phone in phones)

{

if (phone.category == "Персона")

{

if (flagOut)

{

this.dataGridView1.Rows.Add();

}

this.dataGridView1.Rows[j].Cells[0].Value =

phone.category;

this.dataGridView1.Rows[j].Cells[1].Value =

phone.surname;

this.dataGridView1.Rows[j].Cells[2].Value = phone.name;

this.dataGridView1.Rows[j].Cells[3].Value = phone.patr;

this.dataGridView1.Rows[j].Cells[5].Value = phone.tel;

this.dataGridView1.Rows[j].Cells[7].Value =

phone.address;

j++;

}

}

flagOut = false;

}

//Вывод всех организаций в таблицу

private void AllOrgToolStripMenuOut_Click(object sender, EventArgs e)

{

while (dataGridView1.Rows.Count != 0) dataGridView1.Rows.Remove(

dataGridView1.Rows[dataGridView1.Rows.Count - 1]);

int j = 0;

flagOut = true;

var phones = log.GetAll();

foreach (var phone in phones)

{

if (phone.category == "Организация")

{

if (flagOut)

{

this.dataGridView1.Rows.Add();

}

this.dataGridView1.Rows[j].Cells[0].Value = phone.category;

this.dataGridView1.Rows[j].Cells[1].Value = phone.surname;

this.dataGridView1.Rows[j].Cells[2].Value = phone.name;

this.dataGridView1.Rows[j].Cells[3].Value = phone.patr;

this.dataGridView1.Rows[j].Cells[4].Value =

phone.GetTitle();

this.dataGridView1.Rows[j].Cells[5].Value = phone.tel;

this.dataGridView1.Rows[j].Cells[7].Value = phone.address;

j++;

}

}

flagOut = false;

}

//Вывод всех друзей в таблицу

private void AllFriendsToolStripMenuOut_Click(object sender,

EventArgs e)

{

while (dataGridView1.Rows.Count != 0)

dataGridView1.Rows.Remove(

dataGridView1.Rows[dataGridView1.Rows.Count - 1]);

int j = 0;

flagOut = true;

var phones = log.GetAll();

foreach (var phone in phones)

{

if (phone.category == "Друг")

{

if (flagOut)

{

this.dataGridView1.Rows.Add();

}

this.dataGridView1.Rows[j].Cells[0].Value = phone.category;

this.dataGridView1.Rows[j].Cells[1].Value = phone.surname;

this.dataGridView1.Rows[j].Cells[2].Value = phone.name;

this.dataGridView1.Rows[j].Cells[3].Value = phone.patr;

this.dataGridView1.Rows[j].Cells[5].Value = phone.tel;

this.dataGridView1.Rows[j].Cells[6].Value =

phone.GetBirthday();

this.dataGridView1.Rows[j].Cells[7].Value = phone.address;

j++;

}

}

flagOut = false;

}

//Ввод нового контакта типа Персона

private void PersonToolStripMenuItem_Click(object sender, EventArgs e)

{

string categ = "Персона";

FormInput newForm = new FormInput(categ);

newForm.Owner = this; //Передаём созданной форме её владельца.

newForm.Show();

}

//Ввод нового контакта категории Организация

private void OrgToolStripMenuInp_Click(object sender, EventArgs e)

{

string categ = "Организация";

FormInput newForm = new FormInput(categ);

newForm.Owner = this; //Передаём созданной форме её владельца.

newForm.Show();

}

//Ввод нового контакта категории Друг

private void FriendToolStripMenuInp_Click(object sender, EventArgs e)

{

string categ = "Друг";

FormInput newForm = new FormInput(categ);

newForm.Owner = this; //Передаём созданной форме её владельца.

newForm.Show();

}

//Поиск по телефону

private void TelToolStripMenuSearch_Click(object sender, EventArgs e)

{

FormSearch newForm = new FormSearch("По телефону");

newForm.Owner = this; //Передаём созданной форме её владельца.

newForm.Show();

}

//Вывод найденного списка контактов в таблицу

public void ShowSearchList(List list)

{

while (dataGridView1.Rows.Count != 0)

dataGridView1.Rows.Remove(

dataGridView1.Rows[dataGridView1.Rows.Count - 1]);

flagOut = true;

int i = 0;

foreach (var phone in list)

{

if (flagOut)

{

this.dataGridView1.Rows.Add();

}

this.dataGridView1.Rows[i].Cells[0].Value = phone.category;

this.dataGridView1.Rows[i].Cells[1].Value = phone.surname;

this.dataGridView1.Rows[i].Cells[2].Value = phone.name;

this.dataGridView1.Rows[i].Cells[3].Value = phone.patr;

this.dataGridView1.Rows[i].Cells[5].Value = phone.tel;

this.dataGridView1.Rows[i].Cells[7].Value = phone.address;

if (phone.category == "Организация")

this.dataGridView1.Rows[i].Cells[4].Value =

phone.GetTitle();

if (phone.category == "Друг")

this.dataGridView1.Rows[i].Cells[6].Value =

phone.GetBirthday();

countInTable++;

i++;

}

flagOut = false;

}

//Поиск по фамилии

private void SurnameToolStripMenuSearch_Click(object sender,

EventArgs e)

{

FormSearch newForm = new FormSearch("По фамилии");

newForm.Owner = this; //Передаём созданной форме её владельца.

newForm.Show();

}

//Сохранение в файл

private void button1_Click(object sender, EventArgs e)

{

FileInfo file = new FileInfo("input.txt");

if (file.Exists)

{

file.Delete();

}

StreamWriter fileOut = file.AppendText();

for(int i = 0; i < log.Count(); i++)

{

fileOut.WriteLine(log.GetText(i));

}

fileOut.Close();

}

//Поиск по префиксу

private void PrefSearchToolStripMenuItem_Click(object sender,

EventArgs e)

{

FormSearch newForm = new FormSearch("По префиксу");

newForm.Owner = this; //Передаём вновь созданной форме её владельца

newForm.Show();

}

}

}

Содержание класса FormInput.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using Phonebook.Files;

using Phonebook.Logic;

using System.Text.RegularExpressions;

namespace Phonebook.UI

{

public partial class FormInput : Form

{

string categ;

public FormInput()

{

InitializeComponent();

}

//Конструктор формы

public FormInput(string categ)

{

InitializeComponent();

this.categ = categ;

if (categ == "Друг")

{

textBoxBirthday.Visible = true;

label6.Visible = true;

}

else

if (categ == "Организация")

{

textBoxTitle.Visible = true;

label7.Visible = true;

}

}

private bool CheckTel(string text)

{

//Проверка для мобильного телефона

Regex reg1 = new Regex(@"^(+7|8)d{10}$");

//Проверка для шестизначного телефона

Regex reg2 = new Regex(@"^d{6}$");

if (reg1.IsMatch(text) || reg2.IsMatch(text))

return true;

else

return false; ;

}

private bool CheckSurname(string text)

{

//Проверка для двойной фамилии

Regex reg1 = new Regex(@"^[А-Яа-яёЁA-Za-z]+-[А-Яа-яёЁA-Za-z]+$");

// Проверка для обычной фамилии

Regex reg2 = new Regex(@"^[А-Яа-яёЁA-Za-z]+$");

if (reg1.IsMatch(text) || reg2.IsMatch(text))

return true;

else

return false;

}

private bool CheckNameAndPatr(string text)

{

//Проверка для имени и отчества,

//которые могут состоять только из букв

Regex reg = new Regex(@"^[А-Яа-яёЁA-Za-z]+$");

if (reg.IsMatch(text) || text == "")

return true;

else

return false;

}

private bool CheckBirthday(string text)

{

Regex reg = new Regex(@"^(?0[1-9]|[12][0-9]|3[01]).

(?0[1-9]|1[012]).(?(19|20)dd)$"); // ДД.ММ.ГГГГ

Match match = reg.Match(text);

if (text == "")

return true;

if(match.Success)

{

Group groupDay = match.Groups["day"];

Group groupMonth = match.Groups["month"];

Group groupYear = match.Groups["year"];

if (groupMonth.Value == "02")

{

if (groupDay.Value == "29")

if (int.Parse(groupYear.Value) % 4 != 0 &&

int.Parse(groupYear.Value) % 100 != 0 &&

int.Parse(groupYear.Value) % 400 != 0)

return false;

if (groupDay.Value == "31" || groupDay.Value == "30")

return false;

}

return true;

}

return false;

}

//Добавление контакта

private void button1_Click(object sender, EventArgs e)

{

Form1 frm = (Form1)this.Owner;

bool flag = false;

if ((textBoxSurname.Text == "") || (textBoxTel.Text == ""))

{

MessageBox.Show(

"Фамилия и телефон - поля, обязательные для заполнения", "Ошибка",

MessageBoxButtons.OK);

}

else

{

if (this.CheckSurname(textBoxSurname.Text) == false)

{

MessageBox.Show(

"Фамилия введена в неверном формате, попробуйте снова", "Ошибка", MessageBoxButtons.OK);

}

else

{

if (this.CheckNameAndPatr(textBoxName.Text) == false)

{

MessageBox.Show(

"Имя введено в неверном формате, попробуйте снова", "Ошибка", MessageBoxButtons.OK);

}

else

{

if (this.CheckNameAndPatr(textBoxPatr.Text) == false)

{

MessageBox.Show(

"Отчество введено в неверном формате, попробуйте снова", "Ошибка", MessageBoxButtons.OK);

}

else

{

if (this.CheckTel(textBoxTel.Text) == false)

{

MessageBox.Show("Телефон должен быть введен в формате:n+7XXXXXXXXXX , 8XXXXXXXXXX или XXXXXX.nПопробуйте снова", "Ошибка", MessageBoxButtons.OK);

}

else

{

if (categ == "Персона")

{

frm.log.Add(textBoxSurname.Text,

textBoxName.Text, textBoxPatr.Text, textBoxAddr.Text, textBoxTel.Text);

}

else

if (categ == "Друг")

{

if

(this.CheckBirthday(textBoxBirthday.Text))

frm.log.Add("Друг", textBoxSurname.Text, textBoxName.Text, textBoxPatr.Text, textBoxAddr.Text, textBoxTel.Text, textBoxBirthday.Text);

else

{

MessageBox.Show(

"Дата рождения введена в неверном формате, попробуйте снова", "Ошибка", MessageBoxButtons.OK);

flag = true;

}

}

else

if (categ == "Организация")

{

if (textBoxTitle.Text == "")

{

MessageBox.Show(

"Название организации - поле, обязательное к заполнению. nПопробуйте снова", "Ошибка", MessageBoxButtons.OK);

flag = true;

}

else

frm.log.Add("Организация",

textBoxSurname.Text, textBoxName.Text, textBoxPatr.Text, textBoxAddr.Text, textBoxTel.Text, textBoxTitle.Text);

}

if (!flag)

this.Close();

}

}

}

}

}

}

}

}

Содержание файла FormSearch.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using Phonebook.Files;

using Phonebook.Logic;

namespace Phonebook.UI

{

public partial class FormSearch : Form

{

//Временный список для хранения

public List list = new List();

int i;

string type;

public FormSearch(string type)

{

this.type = type;

InitializeComponent();

if(type == "По телефону")

{

labelTel.Visible = true;

labelSurname.Visible = false;

}

if (type == "По фамилии")

{

labelTel.Visible = false;

labelSurname.Visible = true;

buttonDelete.Visible = false;

}

if(type == "По префиксу")

{

Pref.Visible = true;

labelTel.Visible = false;

labelSurname.Visible = false;

buttonDelete.Visible = false;

}

}

private void buttonSearch_Click(object sender, EventArgs e)

{

i = -1;

Form1 frm = (Form1)this.Owner;

string str = textBoxTel.Text;

if (str != "")

{

if (type == "По телефону")

{

if (frm.log.SearchToTel(str) != null)

{

list.Add(frm.log.SearchToTel(str));

if (list.Count != 0)

frm.ShowSearchList(list);

}

}

else

{

if (type == "По фамилии")

{

list = frm.log.SearchToSurList(str);

if (list.Count != 0 )

frm.ShowSearchList(list);

}

else

if(type == "По префиксу")

{

list = frm.log.SearchToPrefList(str);

if (list.Count != 0)

frm.ShowSearchList(list);

}

}

if (i == -1 && list.Count == 0)

{

MessageBox.Show(

"Таких контактов не существует", "Ошибка", MessageBoxButtons.OK);

}

}

else

MessageBox.Show(

"Введите данные", "Ошибка", MessageBoxButtons.OK);

}

private void button1_Click(object sender, EventArgs e)

{

this.Close();

}

private void buttonDelete_Click(object sender, EventArgs e)

{

Form1 frm = (Form1)this.Owner;

if (list.Count == 1)

{

frm.log.DeletePhone1(list[0]);

MessageBox.Show(

"Удаление завершено", "Успех", MessageBoxButtons.OK);

this.Close();

}

else

MessageBox.Show(

"Ничего не найдено, следовательно нечего удалять", "Ошибка", MessageBoxButtons.OK);

}

}

}

Просмотров работы: 2529