gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:39:52 25 4
gpt4 key购买 nike

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

假设输入应该遵循这个例子的正则表达式:

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

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

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

最佳答案

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

简单的例子:

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

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

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

关于java - Ragel - 在输入时验证字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/392983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com