首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ragel -在输入时验证字符串

Ragel -在输入时验证字符串
EN

Stack Overflow用户
提问于 2008-12-25 17:19:13
回答 1查看 2K关注 0票数 2

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

假设输入应遵循以下示例regex:

代码语言:javascript
复制
[a-z]{2,5}ABC[0-9]+

我怎么才能用ragel做到这一点?有没有人能给出一个简短的例子,如何用ragel“即时”(在输入时)验证用户输入?

Ragel文档遗漏了一些快速入门的好例子,所以我在这里提问。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-20 19:18:32

您可以使用EOF操作( Ragel文档中的3.2.2 EOF操作部分)使用Ragel动态检查表达式。当检测到输入缓冲区末尾处于有效状态(包括非最终状态)时,将触发它们。

简单的例子:

代码语言:javascript
复制
  main := ([a-z]{2,5}'ABC'[0-9]+) @/{correct = 1;} %{correct = 1;};

操作"@/“适用于所有非最终状态。它包含起始状态,因此在这种情况下,空字符串是正确的。当整个输入缓冲区与模式匹配时,操作"%“表示最终状态。在上面的示例中,两个操作的代码是相同的,但在实践中,最终状态通常是单独处理的。如果不需要,可以简化上面的示例:

代码语言:javascript
复制
  main := ([a-z]{2,5}'ABC'[0-9]+) $/{correct = 1;};

下面是带有C输出的完整Ragel示例,用于检查所提供的模式。我希望把它转换成Java不成问题。

代码语言:javascript
复制
  #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;
  }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/392983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档