簡體   English   中英

Ragel-輸入時驗證字符串

[英]Ragel - validate a String while Input

假設我們要在用戶輸入JTextField時驗證用戶輸入。 為了驗證用戶輸入,我想知道是否可以使用Ragel。

假定輸入應遵循此示例正則表達式:

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

我如何用雷傑爾做到這一點? 誰能舉一個簡短的例子,說明如何使用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;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM