質問
特定の文字列には正規表現を作成しますか?そして、あなたはそのアサーションでそれをすることができますか(コードの前提部分)?
私はGoogleを歩き回っていましたが、説得力を得ることができませんでした。
問題は次のようなものです:
電話番号が有効であることを保証する機能(作業中のクラス)作成手順を作成します。有効な電話番号フォーマットが3つあります。有効な電話番号は、次のいずれかで構成されています。
- 8桁の最初の8桁はゼロ以外の
- 主要なゼロ、単一のゼロ以外の桁領域コード、そしてその後8桁、 これはゼロ以外のです
- 先頭の '+'、その後に2桁の国コード、次に単一のゼロ以外の数字
市外局番、次に8桁目はその最初の桁がゼロ以外のです。
電話番号を検証するときに埋め込みスペースは無視されます。
それは許容されますが、必要ではない、システムにphone_numberクラスを追加することです。 この問題を解決する
解決
回答するいくつかの異なる質問があります:
-
与えられた文字列がEiffelで指定された正規表現と一致するかどうかを確認する方法GOBOライブラリからClass
RX_PCRE_MATCHER
を使用できます。 Featurecompile
では、必要な正規表現を設定することができ、Featurerecognizes
は文字列がそれに一致するかどうかをテストできます。 -
与えられた電話番号仕様に正規表現を書く方法は?私はそれをチェックしていないが、
"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"
のような何かをするべきです。正規表現自体で中間の白いスペースを考慮に入れることは可能ですが、入力文字列にprune_all (' ')
を適用することで、正規表現マッチャーに渡す前にそれらを取り除くのがはるかに簡単です。 -
引数がそれを満足させることを確認するために作成手順に前提条件を追加する方法?前の項目から、
is_phone_number
を取り、指定された文字列が有効な電話番号を表すかどうかを示すSTRING
を返します。簡単な解決策はを書くことです
.make (tel: STRING) require is_phone_number (tel) ...
クラス
BOOLEAN
自体にFeatureis_phone_number
を持ちます。しかし、これは、指定された文字列がこの作成手順を呼び出す前に電話番号を表すかどうかを確認することを防ぎます。そのため、ClassDEPARTMENT
が継承するクラスis_phone_number
にPHONE_NUMBER_VALIDATOR
を移動するのは理にかなっています。同様に、DEPARTMENT
が指定されたルールに対して文字列を検証する必要がある場合は、PHONE_NUMBER
を継承してFegentPHONE_NUMBER_VALIDATOR
を再利用できます。
他のヒント
渓谷は実際にこれを働いていましたが、DUDは今まで共有しません...
これはEiffelStudio 6.2で動作します(注 - これはGOBO)
http://se.inf.ethz.cch/古い/人/ Leitner / GOBO_GUIDELINES / NAMING_Conventions.html
有効な電話番号は、次のいずれかで構成されています。
- 8桁の最初の8桁はゼロ以外の
- 主要ゼロ、単一のゼロ以外の桁領域コード、 その後8桁目は、最初のゼロはゼロ以外のです。
- 主要+続いて2桁の国コードを続ける
その後、単一のゼロ以外の桁領域コード、次に8桁の数字、
その最初のものはゼロ以外のです
電話番号を検証するときに埋め込みスペースは無視されます。
.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