1

ドット付き10進表記の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( Short、Self-Contained、Correct Example )を示していないため、コードの何が問題なのかわかりません。ここに1つあります:

/*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 に答える