Convalida di espressione regolare Eiffel
Domanda
Come si crea un'espressione regolare per una certa stringa? E puoi farlo nell'asserzione (parte della precondizione del codice)?
Sono stato in giro per Google, ma non potevo ottenere nulla di convincente.
La domanda è così:
Aggiungi una precondizione al dipartimento (la classe che stiamo lavorando) Procedura di creazione che garantisce che il numero di telefono sia valido. Esistono tre possibili formati di numero di telefono validi. Un numero di telefono valido è costituito da uno dei:
- .
- otto cifre, il primo dei quali è zero
- Uno zero leader, un singolo codice di area di cifra non zero e quindi otto cifre, il primo di che è non zero
- un '+' leader, seguito da un codice paese a due cifre, quindi una singola cifra non zero
Prefisso e poi otto cifre, il primo dei quali è non zero
Tutti gli spazi incorporati devono essere ignorati durante la convalida di un numero di telefono.
È accettabile, ma non richiesto, per aggiungere una classe Phone_Number al sistema come parte di risolvere questo problema.
Soluzione
Ci sono diverse domande da rispondere:
- .
-
Come controllare se una determinata stringa corrisponde a una specifica espressione regolare in Eiffel? Si può usare un
RX_PCRE_MATCHER
di classe dalla Biblioteca Gobo. La funzionecompile
consente di impostare l'espressione regolare richiesta e la funzionerecognizes
consente di verificare se la stringa lo corrisponde. -
Come scrivere un'espressione regolare per le specifiche del numero di telefono specifiche? Qualcosa come
"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"
dovrebbe fare sebbene non l'ho controllato. È possibile prendere spazi bianchi intermedi nell'espressione regolare stessa, ma è molto più facile sbarazzarsi di loro prima di passare al normale abbinamento dell'espressione applicandoprune_all (' ')
sulla stringa di ingresso. -
Come aggiungere una precondizione a una procedura di creazione per verificare che l'argomento lo soddisfi? Supponiamo che dagli elementi precedenti abbiamo costruito una funzione
is_phone_number
che assume unSTRING
e restituisce unBOOLEAN
che indica se la stringa specificata rappresenta un numero di telefono valido. Una soluzione semplice sarebbe scrivere
.make (tel: STRING) require is_phone_number (tel) ...
e avere una funzione
is_phone_number
nella classeDEPARTMENT
stessa. Ma questo ci impedisce di controllare se la stringa specificata rappresenta un numero di telefono prima di chiamare questa procedura di creazione. Quindi ha senso spostareis_phone_number
alla classePHONE_NUMBER_VALIDATOR
che la classeDEPARTMENT
sarà eredita. Allo stesso modo, sePHONE_NUMBER
ha bisogno di convalidare la stringa da regole specificate, può ereditarePHONE_NUMBER_VALIDATOR
e riutilizzare la funzioneis_phone_number
.
Altri suggerimenti
Halikal ha effettivamente lavorato questo, ma DUD non condivide fino ad ora ...
funziona a Eiffelstudio 6.2 (Nota - questo è Gobo)
http://se.inf.ethz.ch/Vecchio / Persone / Leitner / Gobo_Guidelines / Naming_conventions.html
Un numero di telefono valido è composto da uno dei:
- .
- otto cifre, il primo dei quali è zero
- Uno zero leader, un singolo codice area cifra non zero, e poi otto cifre, il primo dei quali è non zero
- un leader + seguito da un codice paese a due cifre,
quindi un singolo codice area cifra non zero, quindi otto cifre,
il primo dei quali è non zero
Tutti gli spazi incorporati devono essere ignorati durante la convalida di un numero di telefono.
.require -- 040 is ascii hex space valid_phone: match(phone, "^\040*[1-9]\040*([0-9]\040*){7}$") = TRUE or match(phone, "^\040*0\040*([1-9]\040*){2}([0-9]\040*){7}$") = TRUE or match(phone, "^\040*\+\040*([0-9]\040*){2}([1-9]\040*){2}([0-9]\040*){7}$") = TRUE feature --Regular Expression check match(text: STRING; pattern: STRING): BOOLEAN is -- checks whether 'text' matches a regular expression 'pattern' require text /= Void pattern /= Void local dfa: LX_DFA_REGULAR_EXPRESSION --There's the Trick! do create dfa.make dfa.compile(pattern, True) --There's the Trick! check -- regex must be compiled before we can use it dfa.is_compiled; end Result := dfa.matches(text) -- debug: make sure of which pattern if dfa.matches (text) then io.putstring(text + " matches " + pattern + "%N") end end end