1

我有一个下面给出的模式来匹配点分十进制表示法中的 ipv4 地址。

IPV4ADDRESS (([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))

我用

%x S_rule S_dst_ip

<S_rule>(dst-ip){SPACE}   {

           BEGIN(S_dst_ip);

        }


<S_dst_ip>\{{IPV4ADDRESS}\}  {

       /*code to process the sring here.*/
     }

匹配表单的输入

dst-ip {10.13.12.138}

现在我想匹配

dst-ip { 10.13.12.138 } in addition to dst-ip {10.13.12.138}

我将上面定义的 IPV4ADDRESS 修改如下

IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \t]*

但是,此修改似乎不匹配

  dst-ip { 10.13.12.138 } OR dst-ip {10.13.12.138}

有人可以指出我的代码中的错误吗?

4

1 回答 1

1

由于它“对我有用”,因此我无法告诉您您的代码有什么问题,因为您没有显示 SSCCE(简短、独立、正确的示例)。这是一个:

/*IPV4ADDRESS     (([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))*/
IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \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;
}

使用基于问题文本的测试数据文件:

dst-ip {10.13.12.138}
dst-ip { 10.13.12.138 } 
dst-ip {10.13.12.138}
dst-ip { 10.13.12.138 } OR dst-ip {10.13.12.138}

上面的程序产生(省略了一些空白行):

MATCH [{10.13.12.138}]

MATCH [{ 10.13.12.138 }]

MATCH [{10.13.12.138}]

MATCH [{ 10.13.12.138 }]

 OR 

MATCH [{10.13.12.138}]

如果我不得不猜测出了什么问题,我怀疑您S_rule在识别后错过了切换回状态S_dst_ip(也可能是开头%{ BEGIN S_rule; %}短语)。

我顺便指出,这将被接受{999.999.999.999}为 IPv4 地址。但是,使用更严格控制的表达式来解决这个问题是可行的,并且与您的主要问题无关。

于 2012-12-06T07:48:46.170 回答