Работа с регулярными выражениями

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 07.08.2013
Размер файла 197,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ВВЕДЕНИЕ

регулярный алгебраический программа

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

В замкнутом полукольцевсех языков в алфавите рассмотрим подалгебру, порожденную множеством, которое состоит из пустого языка, языка, всех языков (каждый из которых содержит единственную однобуквенную цепочку), и замкнутую относительно итерации. Эта подалгебра, обозначаемая, есть полукольцо с итерацией. Оно играет важнейшую роль в теории формальных языков. Его называют полукольцом регулярных языков.

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

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

1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

1.1 Операторы регулярных выражений

Как говорилось выше: регулярные выражений обозначают (задают, или представляют) языки. В качестве примера рассмотрим регулярное выражений 01* + 10*. Оно определяет язык всех цепочек, состоящих либо из одного нуля, за которым следует любое количество единиц, либо из одной единицы, за которой следует произвольное количество нулей.

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

1. Объединение двух языков L и M, обозначаемое LM - это множество цепочек, которые содержатся либо в L, либо в M, либо в обоих языках.

2. Конкатенация языков L и M - множество цепочек, которые можно образовать путем дописывания к любой цепочке из K любой цепочки из M. Например, если L = {001, 10, 111} и M = {е, 001}, то L.M, или просто LM - это {001,10,111, 001001, 10001, 111001}. Первые три цепочки в LM - это цепочки из L, соединенные с е. Поскольку е является единицей (нейтральным элементом) для операции конкатенации, результирующие цепочки, будут такими же, как и цепочки из L.

3. Итерация (“звездочка”, или замыкание Клини) языка L обозначается L* и представляет собой множество всех тех цепочек, которые можно образовать путем конкатенации любого количества цепочек из L. При этом допускаются повторения, т.е. одна и та же цепочка из L может быть выбрана для конкатенации более одного раза. Например, если L = {0,1}, то L* - это все цепочки, состоящие из нулей и единиц. Если L = {0,11}, то в L* входят цепочки из нулей и единиц, содержащие четное количество единиц, например 011, 11110, е.

1.2 Построение регулярных выражений

Все алгебры начинаются с некоторых элементарных выражений. Обычно это константы и/или переменные. Применяя определенный набор операторов к этим элементарным выражений и уже построенным выражениям, можно конструировать более сложные выражения. Обычно необходимо так же иметь некоторые методы группирования операторов и операндов, например, с помощью скобок.

Алгебра регулярных выражений строится по такой же схеме: используются константы и переменные для обозначения языков и операторы для обозначения трёх операций из раздела 1.1. Регулярные выражения можно определить рекурсивно. В этом определении не только характеризуются правильные регулярные выражения, но и для каждого регулярного выражения описывается представленный им язык, который обозначается через

Базис состоит из трех частей:

1. Константы е и Ш Являются регулярными выражениями, определяющими языки {е} и Ш, соответственно, т.е. . и

2. Если - произвольный символ, то - регулярное выражение, определяющее язык. Т.е. .

3. Переменная, обозначенная прописной курсивной буквой, например, представляет произвольный язык.

1.3 Лексический анализ

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

Unix-команда lex и ее GNU-версия flex получают на вход список регулярных выражений в стиле UNIX, за каждым из которых в фигурных скобках следует код, указывающий, что должен делать лексический анализатор, если найдет экземпляр такой лексемы. Такая система называется генератором лексического анализатора, поскольку на ее вход поступает высокоуровневое описание лексического анализатора и по этому описанию она создает функцию, которая представляет собой работающий лексический анализатор.

Такие команды, как lex и flex, оказались очень удобными, поскольку мощность нотации регулярных выражений необходима и достаточна для описания лексем. Эти команды способны использовать процедуру преобразования регулярного выражения в детерминированный конечный автомат для того чтобы генерировать эффективную функцию, разбивающую исходную программу на лексемы. Они превращают задачу построения лексического анализатора в “послеобеденную работу”, тогда как создания этих основанных на регулярных выражениях средств построение лексического анализатора вручную могло занимать несколько месяцев. Кроме того, если по какой-либо причине возникает необходимость модифицировать лексический анализатор, то намного проще изменить одно или два регулярных выражения, чем забираться внутрь загадочного когда, чтобы исправить дефект.

2. ПРАКТИЧЕСКАЯ ЧАСТЬ

2.1 Применение регулярных выражений

Основным средством для поиска образцов (шаблонов) в тексте являются регулярные выражения, задающие “схему” образца, который нужно распознать. Регулярные выражения компилируются в детерминированные или недетерминированные автоматы, которые затем моделируются дл получения программы распознавания образов в тексте.

Общая проблема, для решения которой технология регулярных выражений оказалась весьма полезной, заключается в описании нечетко определенного класса образцов в тексте. Нечеткость описания, в сущности, является гарантией того, что с самого начала нет нужды корректно и полно описывать образцы. Не исключено, что мы никогда не сможем получить точное и полное описание. С помощью регулярных выражений можно не прилагая больших усилий, описывать такие образцы и быстро изменять эти описания, если результат нас не устраивает. Кроме того, “компилятор” для регулярных выражений годен и для преобразования записываемых выражений в выполнимый код.

2.2 Постановка задачи и выбор среды разработки

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

После того, как задача была сформулирована, необходимо определиться с наиболее подходящей средой разработки. Данную задачу, можно интерпретировать как построение конечного автомата, для распознавания регулярных выражений. С данной точки зрения, наиболее всего подходят среды разработки C/C++. Данные IDE предпочтительнее в силу того, что обладают всеми необходимыми средствами для решения поставленной задачи. Для C++ существует собрание библиотек, которое расширяет функциональность данного языка, в частности boost/regex имеет всю необходимую функциональность для фильтрации, поиска, разбора и обработки текста.

2.3 Тестирование и отладка программы

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

Ниже представлен скриншот выполнения работы программы reg1.cpp. Данная программа будет проверять строку “one.regtesttwothree”.

Рисунок 1. Результат работы программы reg1.cpp

Данная программа работает не совсем корректно, точнее не совсем по тому плану, который был поставлен в постановке задачи. Если предоставить программе на проверку строку вроде “onetwo.regtestthree”, то результат будет следующим.

Рисунок 2. Тестирование reg1.cpp

Как видно из рис. 2, программа извлекла весь текст строки, написанный до .regtest, а по условию необходимо было извлечь лишь одно слово перед .regtest. Поэтому данная программа работает не совсем корректно. Для того, чтобы полностью удовлетворить требованиям к задаче, была разработана вторая версия программы - reg2.cpp.

Предоставим reg2.cpp строку “onetwo.regtestthree”

Рисунок 3. Результат работы reg2.cpp

Программа корректно обработала данную строку и вывела необходимые данные. Попробуем усложнить задачу, и введем строку “testmy.regtestprogramplease.regtest”.

Рисунок 4. Тестирование reg2.cpp

Как видно из рис.4 программа reg2.cpp корректно обрабатывает исходные данные, и извлекает необходимую информацию.

В ходе тестирования приложений reg1.cpp и reg2.cpp было установлено, что оба приложения работают корректно, однако программа reg2.cpp наиболее точно выполняет указанные требования в постановке задачи. Листинги обеих программ можно найти в приложениях А и Б.

2.4 Возможная модификация приложений

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

Что касается технических изменений, то тут возможно использование описанной выше библиотеки boost/regex для уменьшения размеров программного кода, т.к. алгоритмы regex_match, regex_search, regex_replace, regex_iterator, regex_token_iterator, Partial match заметно упрощают процесс разработки программы и уменьшают количество строк программного кода.

ЗАКЛЮЧЕНИЕ

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

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

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

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Хопкрофт, Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. / Д. Хопкрофт, Э. Мотвани, Р. Ульман - М.: Издательский дом “Вильямс”, 2002. - 528 с.

2. СТО ЮУрГУ 04-2008 Стандарт организации. Курсовое и дипломное проектирование. Общие требования к содержанию и оформлению / составители: Т.И. Парубочая, Н.В. Сырейщикова, В.И. Гузеев, Л.В. Винокурова. - Челябинск: Изд-во ЮУрГУ, 2008. - 56 с.

3. Молчанов, А.Ю. Системное программное обеспечение: Учебник для вузов / А.Ю. Молчанов. - СПб.: Питер, 2006. - 396 с.

ПРИЛОЖЕНИЯ

Приложение А

Листинг программы reg1.cpp

Приложение Б

Листинг программы reg2.cpp

Размещено на Allbest.ru


Подобные документы

  • Операторы регулярных выражений, их построение и лексический анализ. Разработка конечного автомата для распознавания регулярных выражений в среде разработки C/C++. Создание программ для поиска в тексте необходимой информации, их тестирование и отладка.

    контрольная работа [199,0 K], добавлен 04.06.2013

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

    курсовая работа [1,7 M], добавлен 17.09.2013

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

    курсовая работа [567,9 K], добавлен 30.01.2016

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

    дипломная работа [858,0 K], добавлен 16.07.2013

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

    курсовая работа [36,9 K], добавлен 21.07.2012

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

    курсовая работа [1,4 M], добавлен 25.04.2012

  • Ознакомление со структурой языка программирования Turbo-Pascal 7.0, его алфавитом, выражениями и простейшими конструкциями (метками, идентификаторами). Способы описания арифметических, вещественных, логических и символьных операций в программной среде.

    реферат [68,2 K], добавлен 07.02.2011

  • Рассмотрение основ разработки технического задания. Проектирования структуры программ; описание соответственного алгоритма. Собственно программирование. Тестирование и отладка компьютерных программ. Ознакомление с основными правилами защиты проекта.

    реферат [157,4 K], добавлен 15.11.2014

  • Реализация комплекса программ поиска подстроки в тексте алгоритмом прямого поиска и алгоритмом Кнута-Морриса-Пратта. Сравнительный анализ теоретических и экспериментальных оценок эффективности алгоритмов. Разработка структуры программы, ее листинг.

    курсовая работа [2,8 M], добавлен 22.01.2015

  • Изучение составляющих этапов разработки программ, процесса их тестирования, отладки и документирования в контексте курса обучения начинающих программистов. Теоретический анализ постановки задачи и модели программы, создания текста, семантической отладки.

    курсовая работа [29,2 K], добавлен 28.11.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.