当前位置:  开发笔记 > 编程语言 > 正文

Ragel - 在输入时验证字符串

如何解决《Ragel-在输入时验证字符串》经验,为你挑选了1个好方法。

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

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

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

我如何用ragel做到这一点?任何人都可以举一个简短的例子,说明如何使用ragel"动态"验证用户输入(输入时)?

Ragel文档错过了快速入门的一些好例子,所以我在这里问.



1> Artem Zankov..:

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

  %%{
   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;
  }

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有