2008-12-25 167 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; 
    }