Проверка регулярного выражения Eiffel

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

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

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

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

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

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

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


person haikalpribadi    schedule 26.03.2011    source источник


Ответы (2)


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

  1. Как проверить, соответствует ли данная строка указанному регулярному выражению в Eiffel? Можно использовать класс RX_PCRE_MATCHER из библиотеки Gobo. Функция 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.

person Alexander Kogtenkov    schedule 28.03.2011

Халикал на самом деле разобрался с этим, но не поделился до сих пор ...

Это работает в eiffelStudio 6.2 (примечание - это гобо)

http://se.inf.ethz.ch/old/people/leitner/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
person t.odaniel    schedule 02.04.2012
comment
Не забудьте добавить библиотеку $ISE_EIFFEL/contrib/library/gobo/library/lexical - person Pipo; 31.10.2018