2008-12-25 98 views
2

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

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

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

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

Ragel文档没有提供快速入门的一些好例子,所以我在这里问。

+0

为什么你需要使用regal来做到这一点?正确的正则表达式不够好? – Chii 2009-01-02 09:31:15

回答

5

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