質問

特定の文字列には正規表現を作成しますか?そして、あなたはそのアサーションでそれをすることができますか(コードの前提部分)?

私はGoogleを歩き回っていましたが、説得力を得ることができませんでした。

問題は次のようなものです:

電話番号が有効であることを保証する機能(作業中のクラス)作成手順を作成します。有効な電話番号フォーマットが3つあります。有効な電話番号は、次のいずれかで構成されています。

  • 8桁の最初の8桁はゼロ以外の
  • 主要なゼロ、単一のゼロ以外の桁領域コード、そしてその後8桁、 これはゼロ以外のです
  • 先頭の '+'、その後に2桁の国コード、次に単一のゼロ以外の数字 市外局番、次に8桁目はその最初の桁がゼロ以外のです。

    電話番号を検証するときに埋め込みスペースは無視されます。

    それは許容されますが、必要ではない、システムにphone_numberクラスを追加することです。 この問題を解決する

役に立ちましたか?

解決

回答するいくつかの異なる質問があります:

  1. 与えられた文字列がEiffelで指定された正規表現と一致するかどうかを確認する方法GOBOライブラリからClass RX_PCRE_MATCHERを使用できます。 Feature compileでは、必要な正規表現を設定することができ、Feature recognizesは文字列がそれに一致するかどうかをテストできます。

  2. 与えられた電話番号仕様に正規表現を書く方法は?私はそれをチェックしていないが、"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"のような何かをするべきです。正規表現自体で中間の白いスペースを考慮に入れることは可能ですが、入力文字列にprune_all (' ')を適用することで、正規表現マッチャーに渡す前にそれらを取り除くのがはるかに簡単です。

  3. 引数がそれを満足させることを確認するために作成手順に前提条件を追加する方法?前の項目から、is_phone_numberを取り、指定された文字列が有効な電話番号を表すかどうかを示すSTRINGを返します。簡単な解決策はを書くことです

    make (tel: STRING)
        require
            is_phone_number (tel)
        ...
    
    .

    クラスBOOLEAN自体にFeature is_phone_numberを持ちます。しかし、これは、指定された文字列がこの作成手順を呼び出す前に電話番号を表すかどうかを確認することを防ぎます。そのため、Class DEPARTMENTが継承するクラスis_phone_numberPHONE_NUMBER_VALIDATORを移動するのは理にかなっています。同様に、DEPARTMENTが指定されたルールに対して文字列を検証する必要がある場合は、PHONE_NUMBERを継承してFegent PHONE_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
    
    .

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top