2

ユーザーが JTextField に入力しているときに、ユーザー入力を検証したいとします。ユーザー入力の検証には、Ragel を使用できないかと考えています。

入力が次の例の正規表現に従う必要があると仮定します。

[a-z]{2,5}ABC[0-9]+

ラゲルでこれを行うにはどうすればよいですか?Ragel を使用してユーザー入力を「その場で」(入力中に) 検証する方法の短い例を誰かに教えてもらえますか?

Ragel のドキュメントには、クイック スタートの良い例がいくつか欠けているので、ここで質問します。

4

1 に答える 1

5

EOFアクション(Ragelドキュメントのセクション3.2.2 EOFアクション)を使用して、Ragelを使用してその場で式をチェックできます。これらは、入力バッファーの終わりが有効な状態(非ファイナルを含む)で検出されたときにトリガーされます。

簡単な例:

  main := ([a-z]{2,5}'ABC'[0-9]+) @/{correct = 1;} %{correct = 1;};

アクション「@/」は、すべての非最終状態に適用されます。開始状態が含まれているため、この場合は空の文字列が正しいです。アクション「%」は、入力バッファ全体がパターンに一致した場合の最終状態です。上記の例では、両方のアクションのコードは同じですが、実際には最終状態が別々に処理されることがよくあります。不要な場合は、上記のサンプルを簡略化できます。

  main := ([a-z]{2,5}'ABC'[0-9]+) $/{correct = 1;};

提供されたパターンをチェックするためのC出力を備えた完全なRagelサンプルを以下に示します。Javaに変換しても問題ないことを願っています。

  #include <stdio.h>

  %%{
   machine checker;
   write data;
  }%%

  unsigned char checker( const char *str )
  {
   /* standart Ragel variables */
   const char *p = str, *pe = str + strlen( str ) - 1; //-1 to strip "\n"
   const char *eof = pe;
   int cs;

   unsigned char correct = 0;

   %%{
    action final { printf("entire match"); correct = 1; }
    action partial { printf("partial match"); correct = 1; }

    main := ([a-z]{2,5}'ABC'[0-9]+) @/partial %final;

    write init;
    write exec;
   }%%

   return correct;
  };


  #define BUFSIZE 1024
  int main()
  {
   char buf[BUFSIZE];
   while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {
    printf( "%d\n", checker( buf ));
   }
   return 0;
  }
于 2010-10-20T11:18:32.123 に答える