Научно-исследовательская лаборатория систем ЧПУ
Научно-исследовательская лаборатория систем ЧПУ

Поиск по сайту:
 

Расписание курсов "Программирование SINUMERIK 810D/840D/840Di"



Утилита для тестирования шаблонов регулярных выражений

Автор: Лантвойт О.В.
NC Systems
Опубликовано: 27.04.2006
Скачать реализацию утилиты для .NET размер файла: 1613 Kб  

Постановка задачи

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

Поиск существующих решений

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

PCRE (Perl Compatible Regular Expressions) - библиотека предназначенная для работы с регулярными выражениями. Разработчик: Philip Hazel: www.pcre.org

LibXML - библиотеки обработки файлов XML, содержащая функциональность обработки регулярных выражений и поиска по шаблонам. Разработчик: Daniel Veillard www.xmlsoft.org

lrx.h – библиотека шаблонных классов для работы с регулярными выражениями CAtlRegExp и CAtlREMatchContext, позаимствованных из шаблонных классов VC++ 7.0 (или VC++ 8.0). Для оптимизации работы функций в Visual C ++ 6.0 шаблоны этих классов были сокращены и оптимизированы в лаборатории нашей кафедры для решения конкретной задачи.

RE_Server – библиотека для работы с регулярными выражениями строенная в платформу Microsoft .NET. Обладает очень большим количеством поддерживаемых шаблонов. Поддерживает все основные конструкции и синтаксис регулярных выражений.

Диалоговое окно программы

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

Таким образом, при помощи данной утилиты можно тестировать шаблоны регулярных выражений для раличных вводимых данных, а поддержка нескольких самых распространенных библиотек делает её универсальной. Что также очень важно и удобно для конечного пользователя, т.к. кому-то может быть удобней использовать синтаксис ргулярных выражений PCRE, а кому-то lrx или LibXML.

Метасимволы и квантификаторы

Библиотека PCRE

Поддерживаемые метасимволы

Библиотека PCRE ориентирована в основном только для работы с регулярными выражениями. Поэтому поддерживает множество метасимволов.

Символ Синтаксис Описание
^ ^выражение Соответствует началу строки
$ выражение$ Соответствует концу строки
. . Соответствует одному символу
[ ] [abc] Соответствует любому из символов, перечисленных в квадратных скобках
[^] [^аЬс] Соответствует любому символу кроме символов, перечисленных в квадратных скобках
[-] [a-z] Соответствует любому символу из интервала, заданного в квадратных скобках
[^-] [^а-z] Соответствует любому символу кроме символов из интервала, заданного в квадратных скобках
? а? Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения
* а* Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения
+ а+ Соответствует одному и более экземпляров предшествующего символа или подвыражения
| Выражение1 | выражение2 Соответствует левому или правому подвыражению
( ) (выражение1) выражение2 Группировка подвыражений с явным определением приоритета выполняемых операций

Поддерживаемые квантификаторы

* Совпадение 0 и более раз, «жадный» оператор(старается совпасть с максимальным количеством символов)
+ Совпадение 1 и более раз, «жадный»
? Совпадение 0 или 1 раз, «жадный»
{n} Совпадение ровно n раз
{n,} Совпадение не менее n раз, «жадный»
{x,y} Совпадение от x до y раз, «жадный»
*? Совпадение 0 и более раз, «нежадный» оператор(старается совпать с минимальным количеством символов)
+? Совпадение 1 и более раз, «нежадный»

Библиотека LibXML

Поддерживаемые метасимволы

Библиотека LibXML была разработана для работы с XML документами и поэтому функциональность регулярных выражений реализована не полностью. Например, она работает только с отдельнами строками, а для работы с многострочным текстом, необходимо расширять её функциональность.

. . Соответствует одному символу
[ ] [abc] Соответствует любому из символов, перечисленных в квадратных скобках
[-] [a-z] Соответствует любому символу из интервала, заданного в квадратных скобках
? а? Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения
* а* Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения
+ а+ Соответствует одному и более экземпляров предшествующего символа или подвыражения
| Выражение1 | выражение2 Соответствует левому или правому подвыражению
( ) (выражение1) выражение2 Группировка подвыражений с явным определением приоритета выполняемых операций

Поддерживаемые квантификаторы

Единственным главным отчием от других рассмотренных в программе библиотек, является то, что при указании промежутка количества совпадений группы символов или одного символа минимальным количеством вхождений может быть один символ, например a{1, 5}, тогда как в PCRE и .NET возможен вариант a{0, 5}. Но эта проблема решается изменением данного шаблона на такой шаблон: (a{1,5}|a?).

* Совпадение 0 и более раз, «жадный» оператор(старается совпасть с максимальным количеством символов)
+ Совпадение 1 и более раз, «жадный»
? Совпадение 0 или 1 раз, «жадный»
{n} Совпадение ровно n раз, n не равно 0
{n,} Совпадение не менее n раз, «жадный»
{x,y} Совпадение от x до y раз, «жадный», x и y не равны 0

Библиотека lrx

Поддерживаемые метасимволы

Библиотека lrx ,была написана на нашей кафедре для использования в узкоспециализированной задаче, исходя из принципа работы библиотеки встроенной в среду Microsoft Visual Studio 6.0. Но в процессе упрощения библиотеки, для увеличения быстродействия, она утеряля некоторые возможности, которые сказались на синтаксисе регулярных выражений.

Символ Синтаксис Описание
^ ^выражение Соответствует началу строки
$ выражение$ Соответствует концу строки
. . Соответствует одному символу
[ ] [abc] Соответствует любому из символов, перечисленных в квадратных скобках
[^] [^аЬс] Соответствует любому символу кроме символов, перечисленных в квадратных скобках
[-] [a-z] Соответствует любому символу из интервала, заданного в квадратных скобках
[^-] [^а-z] Соответствует любому символу кроме символов из интервала, заданного в квадратных скобках
? а? Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения
* а* Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения
+ а+ Соответствует одному и более экземпляров предшествующего символа или подвыражения
| Выражение1 | выражение2 Соответствует левому или правому подвыражению
( ) (выражение1) выражение2 Группировка подвыражений с явным определением приоритета выполняемых операций

Поддерживаемые квантификаторы

* Совпадение 0 и более раз, «жадный» оператор(старается совпасть с максимальным количеством символов)
+ Совпадение 1 и более раз, «жадный»
? Совпадение 0 или 1 раз, «жадный»
*? Совпадение 0 и более раз, «нежадный» оператор(старается совпать с минимальным количеством символов)
+? Совпадение 1 и более раз, «нежадный»

Библиотека RE_Server Microsoft® .NET

Поддерживаемые метасимволы

Компания Microsoft® .NET в свою очередь так же постаралась написать полноценную библиотеку для работы с регулярными выражениями. Поэтому она так же поддерживает множество различных конструкций.

Символ Синтаксис Описание
^ ^выражение Соответствует началу строки
$ выражение$ Соответствует концу строки
. . Соответствует одному символу
[ ] [abc] Соответствует любому из символов, перечисленных в квадратных скобках
[^] [^аЬс] Соответствует любому символу кроме символов, перечисленных в квадратных скобках
[-] [a-z] Соответствует любому символу из интервала, заданного в квадратных скобках
[^-] [^а-z] Соответствует любому символу кроме символов из интервала, заданного в квадратных скобках
? а? Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения
* а* Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения
+ а+ Соответствует одному и более экземпляров предшествующего символа или подвыражения
| Выражение1 | выражение2 Соответствует левому или правому подвыражению
( ) (выражение1) выражение2 Группировка подвыражений с явным определением приоритета выполняемых операций

Поддерживаемые квантификаторы

* Совпадение 0 и более раз, «жадный» оператор (старается совпасть с максимальным количеством символов)
+ Совпадение 1 и более раз, «жадный»
? Совпадение 0 или 1 раз, «жадный»
{n} Совпадение ровно n раз
{n,} Совпадение не менее n раз, «жадный»
{x,y} Совпадение от x до y раз, «жадный»
*? Совпадение 0 и более раз, «нежадный» оператор (старается совпать с минимальным количеством символов)
+? Совпадение 1 и более раз, «нежадный»

Использование утилиты

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

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

а) Создать шаблон строки.

б) Протестировать шаблон с помощью данной утилиты.

в) После тестирования редактировать шаблон, при необходимости.

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

а) Создаем шаблон

^([a-z]|[A-Z]){0,4} [+-][0-9]{0,4}.[0-9]{0,4}[Ee][+-][0-9]{0,2}$

б) Тестируем его, используя различные библиотеки.

1. PCRE

2. LibXML. Так как механизм регулярных выражений библиотеки LibXML не поддерживает поиск слова в строке, то шаблон необходимо изменить. И он примет следущий вид:

([A-Z]|[a-z]){1,4} [+-][0-9]{1,4}.[0-9]{1,4}[0-9]{1,4}[+-][Ee][0-9]{1,2}

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

^[a-z]|[A-Z]?[a-z]|[A-Z]?[a-z]|[A-Z]?[a-z]|[A-Z]?[+-][0-9]?[0-9]?[0-9]?[0-9]?.[0-9]?[0-9]?[0-9]?[0-9]?[Ee][+-][0-9]?[0-9]?$

4. RE_Server Microsoft® .NET. Эта библиотека поддерживает большинство метасимволов, конструкций и квантификаторов, поэтому шаблон оставляем неизменным.

^([a-z]|[A-Z]){0,4} [+-][0-9]{0,4}.[0-9]{0,4}[Ee][+-][0-9]{0,2}$

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

Опорные статьи, посвященные данной тематике.

Реализация поиска с использованием “wildcard” символов на базе регулярных выражений. Автор: д.т.н. Мартинов Г.М

Использование регулярных выражений для фильтрации ввода. Козак Н.В.


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