假设我们要验证用户输入,而用户正在输入 JTextField。为了验证用户输入,我想知道我是否可以使用 Ragel。
假设输入应遵循此示例正则表达式:
[a-z]{2,5}ABC[0-9]+
我怎么能用 ragel 做到这一点?任何人都可以举一个简短的例子,如何使用 ragel “即时”(输入时)验证用户输入吗?
Ragel 文档遗漏了一些快速入门的好例子,所以我在这里问。
假设我们要验证用户输入,而用户正在输入 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;};
动作“@/”适用于所有非最终状态。它包括起始状态,因此空字符串对于这种情况是正确的。当整个输入缓冲区与模式匹配时,动作“%”用于最终状态。在上面的示例中,两个动作的代码是相同的,但在实践中通常要分别处理最终状态。如果不需要,则可以简化上面的示例:
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;
}