문제

사용자가 jtextfield에서 입력하는 동안 사용자 입력을 검증하려고한다고 가정합니다. 사용자 입력을 확인하기 위해 Ragel을 사용할 수 있는지 궁금합니다.

입력 이이 예제 Regex를 따라야한다고 가정합니다.

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

Ragel로 어떻게 할 수 있습니까? 누구든지 Ragel을 사용하여 "비행 중"(입력하는 동안)를 입력하는 방법을 짧은 예를 제시 할 수 있습니까?

Ragel 문서는 빠른 시작을위한 몇 가지 좋은 예를 놓치므로 여기서 묻습니다.

도움이 되었습니까?

해결책

Ragel과의 즉석 표현을 확인하기 위해 EOF 조치 (Ragel 문서의 3.2.2 EOF 조치)를 사용할 수 있습니다. 입력 버퍼의 끝이 유효한 상태 (비 정제 포함)에서 감지 될 때 트리거됩니다.

Simple example:

  main := ([a-z]{2,5}'ABC'[0-9]+) @/{correct = 1;} %{correct = 1;};

조치 "@/"는 모든 비 결합 상태에 대한 것입니다. 시작 상태가 포함되어 있으므로이 경우 빈 문자열이 정확합니다. 액션 "%"는 전체 입력 버퍼가 패턴과 일치 할 때 최종 상태에 대한 것입니다. 위의 예제에서 두 작업 모두에 대한 코드는 동일하지만 최종 상태는 종종 실제로 별도로 처리됩니다. 필요하지 않은 경우 위의 샘플을 단순화 할 수 있습니다.

  main := ([a-z]{2,5}'ABC'[0-9]+) $/{correct = 1;};

제공된 패턴을 확인하기위한 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;
  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top