Вопрос

Как создать регулярное выражение для определенной строки?И можете ли вы сделать это в утверждении (предварительная часть кода)?

Я гуглил, но ничего убедительного не нашел.

Вопрос такой:

Добавьте предварительное условие в процедуру создания DEPARTMENT (класс, над которым мы работаем), гарантирующее, что номер телефона действителен.Существует три возможных допустимых формата телефонных номеров.Действительный номер телефона состоит из одного из:

  • восемь цифр, первая из которых ненулевая
  • Ведущий ноль, единый нену-код цифр, а затем восемь цифр, первым из которых является ненулевой
  • Ведущий «+», за которым следует двухзначный код страны, затем один код ненулевой цифры, а затем восемь цифр, первым из которых является ненулевое

Любые встроенные пробелы при проверке номера телефона следует игнорировать.

Это приемлемо, но не обязательно добавить класс Phone_number в систему как часть решения этой проблемы.

Это было полезно?

Решение

Есть несколько разных вопросов, на которые нужно ответить:

  1. Как проверить, соответствует ли данная строка указанному регулярному выражению в Eiffel?Можно использовать класс RX_PCRE_MATCHER из библиотеки Гобо.Особенность compile позволяет установить необходимое регулярное выражение и функцию recognizes позволяет проверить, соответствует ли строка ей.

  2. Как написать регулярное выражение для заданной спецификации номера телефона?Что-то вроде "(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}" должен сделать, хотя я это не проверял.Можно учитывать промежуточные пробелы в самом регулярном выражении, но гораздо проще избавиться от них перед переходом к сопоставителю регулярных выражений, применив prune_all (' ') во входной строке.

  3. Как добавить предварительное условие в процедуру создания, чтобы убедиться, что аргумент ему удовлетворяет?Предположим, что из предыдущих пунктов мы построили функцию is_phone_number это требует STRING и возвращает BOOLEAN это указывает, представляет ли указанная строка действительный номер телефона.Простым решением было бы написать

    make (tel: STRING)
        require
            is_phone_number (tel)
        ...
    

    и есть особенность is_phone_number в классе DEPARTMENT сам.Но это не позволяет нам перед вызовом процедуры создания проверить, представляет ли указанная строка номер телефона.Так что имеет смысл переехать is_phone_number к классу PHONE_NUMBER_VALIDATOR этот класс DEPARTMENT унаследует.Аналогично, если PHONE_NUMBER необходимо проверить строку на соответствие указанным правилам, она может наследовать PHONE_NUMBER_VALIDATOR и повторно использовать эту функцию is_phone_number.

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

Halikal на самом деле работал этому, но Dud не поделитесь до сих пор ...

Это работает в Eiffelstudio 6.2 (Примечание - это GOBO)

http://se.inf.ethz.ch/Старый / Люди / Лейтнер / Gobo_Guidelines / Naming_Conventions.html

Допустимый номер телефона состоит из одного из:

    .
  • восемь цифр, первый из которых не нулевой
  • Ведущий ноль, один код ненулевой цифры, а затем восемь цифр, первый из которых не нулевой
  • ведущий + с последующим двузначным кодом страны, затем один код не нулевой цифры, а затем восемь цифр, первый из которых не равен нулю

    Любые встроенные пространства должны игнорироваться при проверке номера телефона.

    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
    
    .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top