Проверка правильности регулярного выражения Eiffel - PullRequest
1 голос
/ 26 марта 2011

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

Я гуглял вокруг, но не смог ничего убедить.

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

Это работает в 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
2 голосов
/ 28 марта 2011

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

  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.

...