Проблемму контроля симантики вводимого выражения попробуем решить на базе регулярных выражений. К сожалению, данный механизм не представлен как таковой в 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 Схема реализации функций для проверки маски ввода
Функции показывают, соответствует ли строка заданному шаблону.
Return Values
CheckMask возвращает TRUE если строка соответствует шаблону. Иначе возвращается FALSE.
CheckMaskEx возвращает REPARSE_ERROR_OK, если строка соответствует шаблону. Иначе возвращается другое значение из перечисления REParseError.
Parameters
_bstr_t bstrTemplate
Строка, задающая шаблон. Шаблон строки, передаваемый в функцию, задаётся в соответствии с правилами задания регулярных выражений, представленных в описании класса CatlRegExp.
_bstr_t bstrText
Строка текста, который проверяется по шаблону
_bstr_t* pbstrOKMessage
Указатель на строку. В неё будут переданы группы совпадений, которые были найдены в передаваемой строке по заданному шаблону.
Подключение функций к проекту
Для использования функций к проекту необходимо добавить файл atlcollrx.h. Данные функции реализованы как статические. Их реализация располагается в данном файле.
Передаём строки в функцию сравнения. Выводим результат.
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"
Список ссылок
Описание классов CatlRegExp и CAtlREMatchContext в Visual Studio .NET Documentation . Так же см Приложение к данному документу.
Описание перечисления REParseError .
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.