Frage

Als nächstes wollen wir Benutzereingaben validieren, während der Benutzer in einem JTextField eingeben. Für die Benutzereingabe Validieren, frage ich mich, wenn ich Ragel verwenden könnte.

die Eingabe Angenommen, sollte dieses Beispiel regex wie folgt vor:

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

Wie kann ich das mit ragel? Kann jemand ein kurzes Beispiel geben, wie Benutzereingaben „on the fly“ zu validieren (während inputing) mit ragel?

Die Ragel Dokumentationen vermisst einige gute Beispiele für einen Schnellstart, so frage ich hier.

War es hilfreich?

Lösung

Sie können mit EOF Aktionen (Abschnitt 3.2.2 EOF Aktionen in der Dokumentation Ragel) für on the fly mit Ragel der Ausdrücke zu überprüfen. Sie werden ausgelöst, wenn das Ende des Eingabepuffers in einem gültigen Zustand (einschließlich nicht-final) erkannt wird.

Einfaches Beispiel:

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

Aktion „@ /“ ist für alle Nicht-Endzustände. Es enthält Zustand so leere Zeichenkette beginnt für diesen Fall korrekt ist. Aktion „%“ ist für Endzustand, wenn gesamte Eingangspuffer das Muster übereinstimmt. In dem obigen Beispiel-Code für beide Aktionen sind die gleichen, aber Endzustand ist oft getrennt in der Praxis zu verarbeiten. Wenn es nicht erforderlich ist, dann über der Probe vereinfacht werden kann:

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

Die komplette Ragel Probe mit C-Ausgang für die bereitgestellte Musterprüfung ist unten. Ich hoffe, dass es kein Problem ist, es zu Java zu konvertieren.

  #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;
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top