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