Проверка регулярного выражения Eiffel
Вопрос
Как создать регулярное выражение для определенной строки?И можете ли вы сделать это в утверждении (предварительная часть кода)?
Я гуглил, но ничего убедительного не нашел.
Вопрос такой:
Добавьте предварительное условие в процедуру создания DEPARTMENT (класс, над которым мы работаем), гарантирующее, что номер телефона действителен.Существует три возможных допустимых формата телефонных номеров.Действительный номер телефона состоит из одного из:
- восемь цифр, первая из которых ненулевая
- Ведущий ноль, единый нену-код цифр, а затем восемь цифр, первым из которых является ненулевой
- Ведущий «+», за которым следует двухзначный код страны, затем один код ненулевой цифры, а затем восемь цифр, первым из которых является ненулевое
Любые встроенные пробелы при проверке номера телефона следует игнорировать.
Это приемлемо, но не обязательно добавить класс Phone_number в систему как часть решения этой проблемы.
Решение
Есть несколько разных вопросов, на которые нужно ответить:
Как проверить, соответствует ли данная строка указанному регулярному выражению в Eiffel?Можно использовать класс
RX_PCRE_MATCHER
из библиотеки Гобо.Особенностьcompile
позволяет установить необходимое регулярное выражение и функциюrecognizes
позволяет проверить, соответствует ли строка ей.Как написать регулярное выражение для заданной спецификации номера телефона?Что-то вроде
"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"
должен сделать, хотя я это не проверял.Можно учитывать промежуточные пробелы в самом регулярном выражении, но гораздо проще избавиться от них перед переходом к сопоставителю регулярных выражений, применивprune_all (' ')
во входной строке.Как добавить предварительное условие в процедуру создания, чтобы убедиться, что аргумент ему удовлетворяет?Предположим, что из предыдущих пунктов мы построили функцию
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