регулярное выражение для адреса ipv4 в нотации CIDR

Я использую приведенное ниже регулярное выражение для сопоставления 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 }

1

Решение

«/» в вашем IPV4ADDRESS шаблон должен быть экранирован («\/«).

Не сбежавший/» в flex шаблон является конечный контекст оператор.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]