Validierung regulärer Eiffel-Ausdrücke
Frage
Wie erstellt man einen regulären Ausdruck für eine bestimmte Zeichenfolge?Und können Sie das in der Assertion (vorausgesetzter Teil des Codes) tun?
Ich habe herumgegoogelt, konnte aber nichts Überzeugendes finden.
Die Frage ist so:
Fügen Sie der Erstellungsprozedur DEPARTMENT (der Klasse, an der wir arbeiten) eine Vorbedingung hinzu, die sicherstellt, dass die Telefonnummer gültig ist.Es gibt drei mögliche gültige Telefonnummernformate.Eine gültige Telefonnummer besteht aus einem von:
- acht Ziffern, von denen die erste ungleich Null ist
- Eine führende Null, ein einzelner zweistelliger Vorwahlkodex von ungleich Null und dann acht Ziffern, von denen der erste ungleich Null ist
- Ein führender '+', gefolgt von einem zweistelligen Landcode, dann einem einzigen zweistelligen Vorwahl und dann acht Ziffern, von denen die erste ungleich Null ist
Bei der Validierung einer Telefonnummer sind alle eingebetteten Leerzeichen zu ignorieren.
Es ist akzeptabel, aber nicht erforderlich, um das System als Teil der Lösung dieses Problems eine Telefon -Number -Klasse hinzuzufügen.
Lösung
Es sind verschiedene Fragen zu beantworten:
Wie überprüfe ich, ob eine bestimmte Zeichenfolge mit einem angegebenen regulären Ausdruck in Eiffel übereinstimmt?Man kann eine Klasse verwenden
RX_PCRE_MATCHER
aus der Gobo-Bibliothek.Das Merkmalcompile
Ermöglicht das Festlegen des erforderlichen regulären Ausdrucks und der Funktionrecognizes
Ermöglicht das Testen, ob die Zeichenfolge mit ihr übereinstimmt.Wie schreibe ich einen regulären Ausdruck für die angegebene Telefonnummernspezifikation?Etwas wie
"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"
sollte tun, obwohl ich es nicht überprüft habe.Es ist möglich, dazwischenliegende Leerzeichen im regulären Ausdruck selbst zu berücksichtigen, aber es ist viel einfacher, sie zu entfernen, bevor sie durch Anwenden an den Matcher für reguläre Ausdrücke übergeben werdenprune_all (' ')
auf der Eingabezeichenfolge.Wie füge ich einer Erstellungsprozedur eine Vorbedingung hinzu, um zu überprüfen, ob das Argument diese erfüllt?Nehmen wir an, dass wir aus den vorherigen Elementen eine Funktion konstruiert haben
is_phone_number
das dauert eineSTRING
und gibt a zurückBOOLEAN
Dies gibt an, ob die angegebene Zeichenfolge eine gültige Telefonnummer darstellt.Eine einfache Lösung wäre das Schreibenmake (tel: STRING) require is_phone_number (tel) ...
und eine Funktion haben
is_phone_number
in der KlasseDEPARTMENT
selbst.Dies hindert uns jedoch daran, vor dem Aufruf dieser Erstellungsprozedur zu prüfen, ob die angegebene Zeichenfolge eine Telefonnummer darstellt.Es macht also Sinn, umzuziehenis_phone_number
zur KlassePHONE_NUMBER_VALIDATOR
diese KlasseDEPARTMENT
wird erben.Ebenso, wennPHONE_NUMBER
Muss die Zeichenfolge anhand der angegebenen Regeln validieren, kann sie erbenPHONE_NUMBER_VALIDATOR
und die Funktion wiederverwendenis_phone_number
.
Andere Tipps
Halikal hat das tatsächlich herausgearbeitet, aber dud teile bis jetzt nicht ...
Dies funktioniert in Eiffelstudio 6.2 (Hinweis - das ist Gobo)
http://se.inf.ethz.ch/alt / leute / leitner / gobo_guidelines / naming_conventions.html
Eine gültige Telefonnummer besteht aus einem von:
- acht Ziffern, der erste davon nicht-Null
- ein führender Null, ein einzelner nicht nullstelliger Bereichscode, und dann acht Ziffern, der erste davon nicht-Null
- ein führendes + gefolgt von einem zweistelligen Ländercode,
dann ein einzelner nicht-Null-Ziffern-Bereichcode und dann acht Ziffern,
der erste davon ist nicht-null
Alle eingebetteten Räume sind beim Bestätigen einer Telefonnummer zu ignorieren. generasacodicetagpre.