Я использую приведенное ниже регулярное выражение для сопоставления IPv4-адреса в нотации CIDR.
[ \t]*(((2(5[0-5]|[0-4][0-9])|[01]?[0-9][0-9]?)\.){3}(2(5[0-5]|[0-4][0-9])|[01]?[0-9][0-9]?)(/(3[012]|[12]?[0-9])))[ \t]*
Я проверил вышеупомянутое, используя [http://regexpal.com/][1]
Кажется, чтобы соответствовать следующий пример 192.168.5.10/24
Однако, когда я использую тот же пример в flex, он говорит «нераспознанное правило». Есть ли какое-то ограничение в flex в том, что он не поддерживает все функции? Вышеупомянутое регулярное выражение кажется довольно простым без использования каких-либо расширенных функций. Можно указать на один момент, почему flex не распознает правило.
Вот краткий автономный пример, который демонстрирует проблему
IPV4ADDRESS [ \t]*(((2(5[0-5]|[0-4][0-9])|[01]?[0-9][0-9]?)\.){3}(2(5[0-5]|[0-4][0-9])|[01]?[0-9][0-9]?)(/(3[012]|[12]?[0-9])))[ \t]*
SPACE [ \t]
%x S_rule S_dst_ip
%%
%{
BEGIN S_rule;
%}
<S_rule>(dst-ip){SPACE} {
BEGIN(S_dst_ip);
}
<S_dst_ip>\{{IPV4ADDRESS}\} {
printf("\n\nMATCH [%s]\n\n", yytext);
BEGIN S_rule;
}
. { ECHO; }
%%
int main(void)
{
while (yylex() != 0)
;
return(0);
}
int yywrap(void)
{
return 1;
}
Когда я пытаюсь сделать flex test.l, это выдает ошибку «нераспознанное правило». Я хочу соответствовать
dst-ip { 192.168.10.5/10 }
«/
» в вашем IPV4ADDRESS
шаблон должен быть экранирован («\/
«).
Не сбежавший/
» в flex
шаблон является конечный контекст оператор.
Других решений пока нет …