Ragel- 입력하는 동안 문자열을 확인하십시오
-
23-08-2019 - |
문제
사용자가 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;
}
제휴하지 않습니다 StackOverflow