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.

È stato utile?

Soluzione

Ci sono diverse domande da rispondere:

    .
  1. 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 funzione compile consente di impostare l'espressione regolare richiesta e la funzione recognizes consente di verificare se la stringa lo corrisponde.

  2. 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 applicando prune_all (' ') sulla stringa di ingresso.

  3. 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 un STRING e restituisce un BOOLEAN 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 classe DEPARTMENT 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 spostare is_phone_number alla classe PHONE_NUMBER_VALIDATOR che la classe DEPARTMENT sarà eredita. Allo stesso modo, se PHONE_NUMBER ha bisogno di convalidare la stringa da regole specificate, può ereditare PHONE_NUMBER_VALIDATOR e riutilizzare la funzione is_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
    
    .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top