CIDR表示法中ipv4地址的正则表达式

时间:2012-12-13 22:07:24

标签: c++ c token lex flex-lexer

我使用下面的正则表达式来匹配CIDR表示法中的ipv4地址。

[ \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 个答案:

答案 0 :(得分:1)

/模式中的“IPV4ADDRESS”需要转义(“\/”)。

/模式中未转义的“flex”是trailing context运营商。