以下の正規表現を使用して、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がルールを認識しない理由を指摘できますか.
これは、問題を示す短い自己完結型の例です
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 }