[英]Eiffel regular expression validation
如何為某個字符串創建正則表達式? 你可以在斷言(代碼的前提條件部分)中做到嗎?
我一直在谷歌周圍,但無法得到任何令人信服的東西。
問題是這樣的:
向DEPARTMENT(我們正在處理的類)創建過程添加前提條件,以確保電話號碼有效。 有三種可能的有效電話號碼格式。 有效的電話號碼包括以下其中一項:
驗證電話號碼時,將忽略任何嵌入的空格。
作為解決此問題的一部分,將PHONE_NUMBER類添加到系統是可接受的,但不是必需的。
有幾個不同的問題需要回答:
如何檢查給定字符串是否與Eiffel中的指定正則表達式匹配? 可以使用Gobo庫中的類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) ...
並在類DEPARTMENT
本身中有一個功能is_phone_number
。 但這會阻止我們在調用此創建過程之前檢查指定的字符串是否代表電話號碼。 因此,將is_phone_number
移動到類DEPARTMENT
將繼承的類PHONE_NUMBER_VALIDATOR
是有意義的。 同樣,如果PHONE_NUMBER
需要根據指定的規則驗證字符串,它可以繼承PHONE_NUMBER_VALIDATOR
is_phone_number
用功能is_phone_number
。
Halikal實際上已經解決了這個問題,但直到現在還沒有分享......
這適用於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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.