【问题标题】:Ragel - validate a String while InputRagel - 在输入时验证字符串
【发布时间】:2010-09-28 10:10:21
【问题描述】:

假设我们要验证用户输入,而用户正在输入 JTextField。为了验证用户输入,我想知道我是否可以使用 Ragel。

假设输入应遵循此示例正则表达式:

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

我怎样才能用 ragel 做到这一点?任何人都可以举一个简短的例子,如何使用 ragel “即时”(输入时)验证用户输入吗?

Ragel 文档缺少一些快速入门的好例子,所以我在这里问。

【问题讨论】:

  • 为什么需要使用 regal 来执行此操作?正则表达式还不够好吗?
  • 我尽量避免无效输入。使用正则表达式,我可以一次验证所有内容并告诉用户输入无效。但我想拒绝无效字符。我的问题是复杂的正则表达式。我认为做到这一点的唯一方法是状态机。我想自动创建状态机

标签: java input validation ragel


【解决方案1】:

您可以使用 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;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-12
    • 2012-05-10
    • 1970-01-01
    • 2011-12-17
    • 2015-04-29
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多