您可以使用Eage操作(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;};
完整Ragel样品与C的输出,用于检查所提供的图案如下。我希望将它转换为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;
}
为什么你需要使用regal来做到这一点?正确的正则表达式不够好? – Chii 2009-01-02 09:31:15