Программирование AVR T-Rex: облегченная библиотека regex Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


T-Rex: облегченная библиотека regex Печать
Добавил(а) microsin   

В обработке вывода от ESP8266 мне очень помогла библиотека регулярных выражений T-Rex [1]. К сожалению, эту библиотеку получится использовать не на всех AVR, потому что её подключение требует целых 8 килобайт памяти программ. Однако если у Вас микроконтроллер наподобие ATmega328 или ATmega32U4, то вполне можете воспользоваться обработкой регулярных выражений с помощью T-Rex.

[Как использовать T-Rex]

Здесь приведен пример использования библиотеки регулярных выражений - проверка строки на IP-адрес.

1. Создайте регулярное выражение на основе структуры типа TRex (в этом примере показано простейшее регулярное выражение для проверки IP-адреса). Можете воспользоваться online-тестером регулярных выражений, как например [2]. С помощью функции trex_compile подготовьте регулярное выражение:

struct TRex *x = trex_compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");

Примечание: метасимвол ^ означает начало строки, \d задает цифры, {1,3} задает количество повторений цифр от 1 до 3, $ означает конец строки.

Обратите внимание, что спецсимволы ('d', '.' и т. п.) экранируются дважды - одно экранирование требует синтаксис regex, второе экранирование требует синтаксис языка C.

2. Проверьте, успешно ли было скомпилировано регулярное выражение (возвращенное функцией компиляции значение x не должно быть равно нулевому указателю), после чего функцией trex_match проверьте, прошла ли проверка на соответствие строки регулярному выражению.

char inputIP [] = "192.168.0.1";
...
struct TRex *x = trex_compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
if (x)
{
   if (trex_match(x, inputIP))
   {
      //Успешное совпадение!
   }
   else
   {
      //Проверка на IP не прошла.
      printf(USB_out, "Нет совпадения!\r\n");
   }
   trex_free(x);
}

Обратите внимание, что если регулярное выражение было скомпилировано успешно (x!=0), то нужно по завершении работы с регулярным выражением обязательно освободить память вызовом trex_free.

3. С помощью функций trex_getsubexpcount и trex_getsubexp Вы можете прочитать подстроки регулярного выражения, которые Вы ограничили круглыми скобками. Вот пример чтения по байтам IP-адреса:

   ...
   if (trex_match(x, regexinput))
   {
      int i,n = trex_getsubexpcount(x);
      TRexMatch match;
      for(i = 0; i < n; i++)
      {
          char t[10];
          trex_getsubexp(x,i,&match);
          strncpy(t,match.begin,match.len);
          printf("%i байт IP = %s\r\n",i+1, t);
      }
   }
   ...
   trex_free(x);
   ...

[Синтаксис регулярных выражений, который поддерживает T-Rex]

К сожалению, из заявленного синтаксиса поддерживается не все, у меня были проблемы с "жадными" выражениями. Например {n,} (означает не меньше n повторений) не поддерживается, нужно обязательно задавать правую границу, вот так {n, m} (означает, что повторений может быть от n до m). Также не поддерживается +.

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

^ Начало строки.

. Любой символ.

$ Конец строки.

| Варианты по ИЛИ.

() Группирование в регулярном выражении (создает capture, т. е. захват подстроки проверяемой строки).

[] Класс символов.

* Совпадение 0 или большее количество раз.

+ Совпадение 1 или большее количество раз (не работает...).

? Совпадение 1 или 0 раз.

{n} Совпадение с точным n количеством повторений.

{n,} Совпадение с количеством повторений не менее n (не работает, приходится использовать {n, m}).

{n,m} Совпадение от n до m раз включительно.

\t tab, табуляция (HT, TAB).

\n символ перехода на новую строку, newline (LF, NL).

\r символ возврата каретки на начала строки, return (CR).

\f символ перехода на новую страницу, form feed (FF).

\l Символы в нижнем регистре.

\u Символы в верхнем регистре.

\a Буквы.

\A Не буквы.

\w Алфавитно-цифровые символы [0-9a-zA-Z].

\W Не алфавитно-цифровые символы.

\s Пробел, space.

\S Не пробел.

\d Цифры.

\D Не цифры.

\x Шестнадцатеричные цифры.

\X Не шестнадцатеричные цифры.

\c Управляющие символы.

\C Не управляющие символы.

\p Символы пунктуации.

\P Не символы пунктуации.

\b Граница слова.

\B Не граница слова.

[API T-Rex]

TRex *trex_compile (const TRexChar *pattern, const TRexChar **error); 

Компилирует регулярное выражение (подготавливает его для использования) и возвратит указатель на его скомпилированную версию. В случае неудачи вернет NULL. Возвращенное значение должно быть удалено (после использования) с помощью функции trex_free(). 

Параметры:

pattern указатель на ASCIZ-строку (строка, оканчивающаяся 0), в которой содержится компилируемое регулярное выражение.

error указатель на строку, в которую будет записано сообщение об ошибке, если компиляция завершилась неудачно.

void trex_free (TRex *exp);

Освобождает память, выделенную под структуру скомпилированного регулярного выражения функцией trex_compile(). 

exp указатель на удаляемую структуру регулярного выражения. 

TRexBool trex_match (TRex* exp, const TRexChar* text);

Возвратит TRex_True, если строка, заданная в параметре text, полностью совпадает с регулярным выражением exp, иначе возвратит TRex_False.

Параметры:

exp скомпилированное регулярное выражение.

text строка, которая проверяется на соответствие регулярному выражению.  

TRexBool trex_search (TRex* exp,
                      const TRexChar* text,
                      const TRexChar** out_begin,
                      const TRexChar** out_end);

Ищет первое совпадение выражения exp в строке, указанной параметром text. Если совпадение найдено, то функция вернет TRex_True, и установит out_begin на начало совпадения, и out_end на конец совпадения; иначе вернет TRex_False.

Параметры:

exp скомпилированное регулярное выражение.

text строка текста, в которой будет осуществляться поиск.

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

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

TREX_API TRexBool trex_searchrange (TRex* exp,
                                    const TRexChar* text_begin,
                                    const TRexChar* text_end,
                                    const TRexChar** out_begin,
                                    const TRexChar** out_end);

Ищет первое совпадение выражения exp в части строки, которая ограничена указателями в параметрах text_begin и text_end. Если совпадение найдено, то будет возвращено TRex_True, и в out_begin будет записан адрес начала совпадения, и в out_end будет записан конец совпадения; иначе будет возвращено TRex_False.

Параметры:

exp скомпилированное регулярное выражение.

text_begin указатель на начало проверяемой строки.

text_end указатель на конец проверяемой строки.

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

out_end указатель на строковый указатель, который будет заполнен адресом конца совпадения.

int trex_getsubexpcount (TRex* exp);

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

exp скомпилированное регулярное выражение.

TRexBool trex_getsubexp (TRex* exp, int n, TRexMatch *submatch);

Запросит начало и указатель на длину подвыражения, указанное индексом n. Результат будет передан через структуру TRexMatch:

typedef struct {
   const TRexChar *begin;
   int len;
} TRexMatch;

Функция вернет TRex_True, если был задан допустимый индекс n, иначе вернет TRex_False.

Примечание: индексация подвыражений начинается с 1. Индексу 0 соответствует вся исходная строка.

Параметры:

exp скомпилированное регулярное выражение.

n индекс подвыражения (capture, заданное в регулярном выражении круглыми скобками).

submatch указатель на структуру, в которой будет сохранен результат.

Эта функция также работает после того, как была выполнена операция проверки на соответствие (trex_match).

[Ссылки]

1. T-Rex minimalistic regular expression library site:github.com.
2. Конструктор регулярных выражений site:pcre.ru.
3. SLRE: сверхлегкая библиотека обработки regex.

 

Добавить комментарий


Защитный код
Обновить

Top of Page