Ragel - проверка строки при вводе

Предположим, мы хотим проверить вводимые пользователем данные, пока пользователь вводит JTextField. Интересно, могу ли я использовать Ragel для проверки пользовательского ввода.

Предположим, что входные данные должны соответствовать этому примеру регулярного выражения:

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

Как это сделать с рагелем? Может ли кто-нибудь дать короткий пример, как проверить ввод пользователя «на лету» (во время ввода) с помощью ragel?

В документации Ragel отсутствуют некоторые хорошие примеры для быстрого старта, поэтому я спрашиваю здесь.

зачем вам это нужно делать с помощью regal? Разве регулярное выражение недостаточно хорошо?

Chii 02.01.2009 12:31

Я стараюсь избегать неверного ввода. С помощью регулярного выражения я могу проверить все сразу и сказать пользователю, что ввод недействителен. Но я бы хотел отклонить недопустимые символы. Моя проблема - сложное регулярное выражение. Я думаю, что единственный способ сделать это - это государственная машина. Я хочу автоматизировать создание государственной машины

Kai Mechel 06.01.2009 00:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 964
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать действия EOF (раздел 3.2.2 Действия EOF в документации Ragel) для проверки выражений на лету с помощью 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;
  }

Другие вопросы по теме