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

regular expression for ipv4 address in CIDR notation

本文关键字:地址 正则表达式 IPv4 表示 CIDR      更新时间:2023-10-16

我使用以下正则表达式来匹配 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("nnMATCH [%s]nn", 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模式中未转义的"/"是尾随上下文运算符。