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

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

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



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

Автор: Козак Н. В.
Опубликовано: 25.12.2003
Версия текста: 1.0

Предисловие

Проблемму контроля симантики вводимого выражения попробуем решить на базе регулярных выражений. К сожалению, данный механизм не представлен как таковой в VC++ 6.0. Поэтому нам пришлось позаимствовать его из шаблонных классов VC++ 7.0 (или VC++ 8.0). В результате, немного сократив и оптемизировав эти шаблоны, мы получили два класса для работы с регулярными выражениями.

Например, если нужно вводить адрес прокси сервера "213.153.125.1" , требуеться задать в элементарной форме регулярное выражение "^ddd.ddd.ddd.d$" . Немного великовато это регулярное выражение, но зато наглядно и просто (d - любая цифра, . - обозначает точку ^ и $ начало и конец строки соответственно, подробности в [1]).


Описание реализации функций

Данные функции реализованы с использованием шаблонных классов для работы с регулярными выражениями CAtlRegExp и CAtlREMatchContext. Для оптимизации работы функций в Visual C ++ 6.0 шаблоны этих классов были сокращены и оптимизированы для решения конкретной задачи. Данные функции сравнения в Visual C ++ 6.0 используют только урезанные версии этих классов. Оптимизированные шаблоны классов и функции располагаются в файле atlcollrx.h.

Схема реализации функций представлена ниже:


Рис. 1 Схема реализации функций для проверки маски ввода

Описание функций

BOOL CheckMask(_bstr_t bstrTemplate, _bstr_t bstrText)

REParseError CheckMaskEx(_bstr_t bstrTemplate, _bstr_t bstrText, _bstr_t* bstrOKMessage)

Функции показывают, соответствует ли строка заданному шаблону.

Return Values

CheckMask возвращает TRUE если строка соответствует шаблону. Иначе возвращается FALSE.

CheckMaskEx возвращает REPARSE_ERROR_OK, если строка соответствует шаблону. Иначе возвращается другое значение из перечисления REParseError.

Parameters

_bstr_t bstrTemplate Строка, задающая шаблон. Шаблон строки, передаваемый в функцию, задаётся в соответствии с правилами задания регулярных выражений, представленных в описании класса CatlRegExp.
_bstr_t bstrText Строка текста, который проверяется по шаблону
_bstr_t* pbstrOKMessage Указатель на строку. В неё будут переданы группы совпадений, которые были найдены в передаваемой строке по заданному шаблону.

Подключение функций к проекту

Для использования функций к проекту необходимо добавить файл atlcollrx.h. Данные функции реализованы как статические. Их реализация располагается в данном файле.

Пример использования

Задаём строку шаблона и строку для сравнения

char p[] = "^{(+|-)?}{\d?\d?\d?}{((.|,)\d\d?\d?)?}$";

_bstr_t str = "+123.21";

Передаём строки в функцию сравнения. Выводим результат.

BOOL Result = CheckMask(p,str);

if(Result)

printf("String %s agree with n %s n", (char*)str, p);		

Задаём строку для получения в ней информации о совпавших группах, которые задаются в шаблоне с использованием фигурных скобок ( {:} ).

_bstr_t r;

Передаём строки в расширенную функцию сравнения. Выводим результат.

REParseError ResultEx = CheckMaskEx(p,str,&r);

if(ResultEx == REPARSE_ERROR_OK)

printf("String %s agree with n %snfinding some match group n%s ",

             (char*)str, p, (char*)r);	

Результат работы представлен ниже:

String +123.21 agree with

 ^{(+|-)?}{d?d?d?}{((.|,)dd?d?)?}$

String +123.21 agree with

 ^{(+|-)?}{d?d?d?}{((.|,)dd?d?)?}$ 

Finding some match group

0:"+"

1:"123"

2:".21"

Список ссылок

  1. Описание классов CatlRegExp и CAtlREMatchContext в Visual Studio .NET Documentation . Так же см Приложение к данному документу.
  2. Описание перечисления REParseError .

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