1

特定の文字列の正規表現をどのように作成しますか? また、アサーション (コードの前提条件部分) でそれを実行できますか?

私はグーグルで検索してきましたが、説得力のあるものは何も得られませんでした。

質問は次のようなものです。

DEPARTMENT (現在取り組んでいるクラス) の作成手順に、電話番号が有効であることを保証する前提条件を追加します。有効な電話番号の形式は 3 つあります。有効な電話番号は、次のいずれかで構成されます。

  • 最初の数字がゼロ以外の 8 桁
  • 先頭のゼロ、ゼロ以外の 1 桁の市外局番、および 8 桁の数字 (最初の数字はゼロ以外)
  • 先頭の「+」、2 桁の国コード、ゼロ以外の 1 桁の市外局番、8 桁の数字 (最初の数字はゼロ以外)

電話番号を検証する際、埋め込まれたスペースは無視されます。

この問題を解決する一環として、システムに PHONE_NUMBER クラスを追加することは許容されますが、必須ではありません。

4

2 に答える 2

2

ハリカルは実際にこれを解決しましたが、今まで共有していませんでした...

これは eiffelStudio 6.2 で動作します (注 - これは gobo です)。

http://se.inf.ethz.ch/old/people/leitner/gobo_guidelines/naming_conventions.html

有効な電話番号は、次のいずれかで構成されます。

  • 最初の数字がゼロ以外の 8 桁
  • 先頭のゼロ、ゼロ以外の 1 桁の市外局番、および 8 桁の数字 (最初の数字はゼロ以外)
  • 先頭の + に続いて 2 桁の国コード、次に 0 以外の 1 桁の市外局番、次に 8 桁 (最初の数字は 0 以外)

電話番号を検証する際、埋め込まれたスペースは無視されます。

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
于 2012-04-02T23:31:29.437 に答える
2

いくつかの異なる質問に答える必要があります。

  1. 指定された文字列がEiffelで指定された正規表現と一致するかどうかを確認するには? RX_PCRE_MATCHERGobo ライブラリのクラスを使用できます。この機能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_VALIDATORDEPARTMENTPHONE_NUMBERPHONE_NUMBER_VALIDATORis_phone_number

于 2011-03-28T07:26:37.930 に答える