Научно-исследовательская лаборатория систем ЧПУ |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Утилита для тестирования шаблонов регулярных выраженийАвтор: Лантвойт О.В.
|
Символ | Синтаксис | Описание |
^ | ^выражение | Соответствует началу строки |
$ | выражение$ | Соответствует концу строки |
. | . | Соответствует одному символу |
[ ] | [abc] | Соответствует любому из символов, перечисленных в квадратных скобках |
[^] | [^аЬс] | Соответствует любому символу кроме символов, перечисленных в квадратных скобках |
[-] | [a-z] | Соответствует любому символу из интервала, заданного в квадратных скобках |
[^-] | [^а-z] | Соответствует любому символу кроме символов из интервала, заданного в квадратных скобках |
? | а? | Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения |
* | а* | Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения |
+ | а+ | Соответствует одному и более экземпляров предшествующего символа или подвыражения |
| | Выражение1 | выражение2 | Соответствует левому или правому подвыражению |
( ) | (выражение1) выражение2 | Группировка подвыражений с явным определением приоритета выполняемых операций |
* | Совпадение 0 и более раз, «жадный» оператор(старается совпасть с максимальным количеством символов) |
+ | Совпадение 1 и более раз, «жадный» |
? | Совпадение 0 или 1 раз, «жадный» |
{n} | Совпадение ровно n раз |
{n,} | Совпадение не менее n раз, «жадный» |
{x,y} | Совпадение от x до y раз, «жадный» |
*? | Совпадение 0 и более раз, «нежадный» оператор(старается совпать с минимальным количеством символов) |
+? | Совпадение 1 и более раз, «нежадный» |
Библиотека 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 ,была написана на нашей кафедре для использования в узкоспециализированной задаче, исходя из принципа работы библиотеки встроенной в среду Microsoft Visual Studio 6.0. Но в процессе упрощения библиотеки, для увеличения быстродействия, она утеряля некоторые возможности, которые сказались на синтаксисе регулярных выражений.
Символ | Синтаксис | Описание |
^ | ^выражение | Соответствует началу строки |
$ | выражение$ | Соответствует концу строки |
. | . | Соответствует одному символу |
[ ] | [abc] | Соответствует любому из символов, перечисленных в квадратных скобках |
[^] | [^аЬс] | Соответствует любому символу кроме символов, перечисленных в квадратных скобках |
[-] | [a-z] | Соответствует любому символу из интервала, заданного в квадратных скобках |
[^-] | [^а-z] | Соответствует любому символу кроме символов из интервала, заданного в квадратных скобках |
? | а? | Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения |
* | а* | Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения |
+ | а+ | Соответствует одному и более экземпляров предшествующего символа или подвыражения |
| | Выражение1 | выражение2 | Соответствует левому или правому подвыражению |
( ) | (выражение1) выражение2 | Группировка подвыражений с явным определением приоритета выполняемых операций |
* | Совпадение 0 и более раз, «жадный» оператор(старается совпасть с максимальным количеством символов) |
+ | Совпадение 1 и более раз, «жадный» |
? | Совпадение 0 или 1 раз, «жадный» |
*? | Совпадение 0 и более раз, «нежадный» оператор(старается совпать с минимальным количеством символов) |
+? | Совпадение 1 и более раз, «нежадный» |
Компания 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}$
в) Теперь можно сделать вывод о качестве, простоте составления регулярных выражений, быстроте работы и в зависимости от поставленной задачи определитьсяс выбором нужного модуля. Таким образом, можно решить практически любую задачу поиска и фильтрации ввода вывода.
Использование регулярных выражений для фильтрации ввода. Козак Н.В.
Лаборатория систем ЧПУ МГТУ "Станкин" © 2002-2024
Россия, Москва, Вадковский переулок, д. 3а Телефон: +7 (499) 972-9440 Факс: +7 (499) 972-1873 |