2017-09-12 5 views
0

Iは複素数のテストのために以下のコードを有する:ルビー正規表現複素数

module RegexPractice 

    def get_complex(input) 
    return input =~ /.*i*/ 
    end 

end 

を以下のコードは、ユニットテストのそれぞれを通過させなければならないが、鉱山は、ユニットテスト#7で始まる失敗しています。私はこれに対処する実装が不明です。何か案は?

def test_complex 

    #1 
    assert_equal(0, RegexPractice.get_complex("4i")) 
    #2 
    assert_equal(0, RegexPractice.get_complex("43i")) 
    #3 
    assert_equal(0, RegexPractice.get_complex("-46i")) 
    #4 
    assert_equal(0, RegexPractice.get_complex("+46i")) 
    #5 
    assert_equal(0, RegexPractice.get_complex("35+46i")) 
    #6 
    assert_equal(0, RegexPractice.get_complex("3-46i")) 
    #7 
    assert_equal(5, RegexPractice.get_complex("num: -35+46i")) 
    #8 
    assert_equal(0, RegexPractice.get_complex("+3-46i")) 
    #9 
    assert_equal(nil, RegexPractice.get_complex("abi")) 
    #10 
    assert_equal(nil, RegexPractice.get_complex("65")) 
end 
+0

「num:-35 + 46i」=〜/.* i */' ' => 0 –

+1

なぜ失敗したテストを編集しましたか?どのバージョンが正しい動作ですか?オリジナルに基づいて回答を書きましたが、あなたの質問は**失敗した**テストに基づいていました。 –

+0

@TomLordコードを見直した後、私は間違いを犯したと思っていたが、テストは本来正しいものだった。投稿を編集してこれを反映させました –

答えて

2

を参照したい場合があります。このようにそれを実現することができます。

module RegexPractice 

    def get_complex(input) 
    input =~ /[+-]?\d*[+-]?\d*i/ 
    end 

end 

問題は、あなたがいないだということです複素数の一部としてiの前に来るかもしれないものについて厳格である。

あなたの現在のコードは、「何かの前に、一致の一部としてiを含める」と言っています。したがって、は常にが文字列の先頭から始まるため、メソッドは0(または一致しない場合はnil)を返します。

私の正規表現を説明するには:「。どちらか+または-文字

  • [+-]?手段 "

    • [+-]手段をゼロまたは上記のいずれかを任意の数字 "(0"
    • \d手段。" 1,2、...、9)。
    • \d*は、上記の「0以上」を意味します。

    換言すれば、これは次のように何もマッチします:

    • "42i"
    • "2-i"
    • "-3+9i"

    しかし含まれていますない試合任意の他の文字列をi


    あなたのテスト#9と#10も失敗(しかし、私の実装を渡す!) - しかし、テストはその最初の障害時に終了しているため、あなたは、これを見ていません。それはまだ単なる「iに続くもの」と一致するので(それはこのような理由のために、別のテストにそれぞれの主張を分割する方が良いでしょう。)

    assert_equal(nil, RegexPractice.get_complex("abi")) 
    

    あなたの方法は、0を返します。

    私の方法では、数字がi(例えば、-3+4i)に続いているため、nilが返されます。任意の文字ではありません。

    assert_equal(nil, RegexPractice.get_complex("65")) 
    

    あなたの方法べき小さなミスを除いて、ここでの仕事、:あなたの正規表現はi*だけではなくiで終わっているので、それが「0以上i s」をマッチします。つまり、にはが含まれていない文字列には、iが含まれています。

    私の方法には間違いがありません。


    あなたは、複雑な文字列を数値に変換したい場合は

    は通常しかし、あなただけ行うことができます:

    Complex(string) 
    

    ...そして、それは例外が発生した場合、その文字列が無効でしたフォーマット。

    "num: -35+46i"のような入力は通常無効です。したがって、これらを受け入れる場合は、最初に何らかの正規表現ルックアップを実行する必要があります。

  • +0

    トムは深い答えをありがとう、トム。私はあなたの実装を試して、テスト#9はまだ失敗していて、 '無し'ではなく '2'を出力しています。 –

    +0

    ああ待っています。これは、 'i'がオプションとマークされる前にすべての文字があるからです。これに対する完璧な答えはちょっと複雑かもしれませんが、単純なままにするために、** iが**の前に数字でなければならないと仮定できますか?これは例えば'2 + i'は残念ながら無効と解釈されますが、' 2 + 1i'はうまくいくでしょう。 –

    +0

    また別の言い方をすると、有効性のルールを明確にすることができますか?なぜabiは無効ですが、num:iは有効ですか? (またはそれも無効ですか?) 'ab i'は有効ですか?ルールは "複素数と他のテキストとの間にスペースがなければならない"か? –

    1

    テストが失敗するのは、間違ったことをテストしている可能性があるからです。

    /.*i*/

    0 or more i's続い 0 or more of any characterの完全一致の最初のインデックスを返し

    RegexPractice.get_complex("num: -35+46i")はあなたと一致しているパターンので、0を返すようにを想定しです。

    あなたが住んでチェックあなたの正規表現のマッチングにRubularを使用することができ、またはコンソールでそれを実行することができます:

    irb >>> "num: -35+46i" =~ /.*i/ => 0

    あなたが最終的にどのにおける複素数の最初のインデックスを返すようにしようとしている場合与えられた文字列の場合、予想される入力に応じてより複雑なパターンマッチングを行う必要があるかもしれません。すなわち、+または-の符号を左の実数と右の複素数で探します。

    最後に、あなただけの作成や複素数と対話したい場合はthis documentation.

    +0

    あなたの推論は本当に意味をなさない... "あなたのテストは間違っているので、失敗しています"?おそらくテストは*正しい*であり、OPはメソッドの正しい代替実装を探していますか? –

    +0

    @TomLord私はあなたの答えが気に入っています!入力いただきありがとうございます。私は怒らせるつもりではありません、私はちょうどOPが "複雑な数字のテスト"の意味を理解していませんでした。 –