|
|
Утилита для тестирования шаблонов регулярных выражений
Автор: Лантвойт О.В.
NC Systems
Опубликовано: 27.04.2006
Скачать реализацию утилиты для .NET
Постановка задачи
Необходимо решить проблему контроля ввода данных пользователем, т.е. ограничить ввод недопустимых данных, а также недопустимых значений вводимых данных. Для этого можно создать определенные шаблоны, которые будут блокировать ввод данных не подходящих под шаблон. Соответственно необходим механизм, поддерживающий работу с такими шаблонами, который облегчил бы написание программы. А также предоставить пользователю мощную систему поиска, которая позволяла бы искать необходимые слова в тексте по определенным шаблонам, а не по их значению, это позволит проверять данные текста на совпадение с шаблонами, с которыми работает программа, если данные, например, будут читаться из файла.
Поиск существующих решений
На данный момент существует очень мощный механизм обработки текста и вводимых данных – Регулярные выражения. Существует несколько библиотек с наборами функций и классов для работы с регулярными выражениями. Для разработки данной утилиты используются:
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” символов на базе регулярных выражений. Автор: д.т.н. Мартинов Г.М
Использование регулярных выражений для фильтрации ввода. Козак Н.В.
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
|