2012-12-13 73 views
1

我使用下面的正則表達式來匹配CIDR表示法中的ipv4地址。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; 
} 

當我嘗試做彎曲test.l它給「無法識別的規則」 error.I想匹配

dst-ip { 192.168.10.5/10 } 
+1

什麼是之後的「(dst-ip)」?爲什麼圍繞IPV4ADDRESS的兩個級別{}? –

+0

我想匹配dst-ip {192.168.10.5/10}這兩個級別{}用於括號。 – liv2hak

回答

1

您的IPV4ADDRESS模式中的「/」需要轉義(「\/」)。

flex模式中的未轉義「/」是trailing context運算符。