1

我正在使用下面的正则表达式来匹配 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 }
4

1 回答 1

1

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

模式中未转义的“ /flex尾随上下文运算符。

于 2012-12-14T00:27:59.730 回答