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