我有以下测试复数的代码:
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
您可以这样实现:
module RegexPractice
def get_complex(input)
input =~ /[+-]?d*[+-]?d*i/
end
end
问题是,作为复杂数字的一部分,您对i
之前可能发生的事情不够严格。
您当前的代码只是在说"在i
作为比赛的一部分之前,请包括任何内容"。因此,匹配始终开始在字符串的开头 - 因此该方法返回0
(或nil
,如果没有匹配)。
解释我的言论:
-
[+-]
的意思是"+
或-
字符。 -
[+-]?
的意思是"零或上述之一"。 -
d
表示"任何数字"(0,1,2,...,9)。 -
d*
的意思是"上述零或更多"。
所以换句话说,这将匹配:
-
"42i"
-
"2-i"
-
"-3+9i"
但是不会匹配包含i
的其他任意字符串。
您的测试#9和#10也失败了(但通过我的实现!) - 但是您没有看到这一点,因为测试在第一次故障时终止。(因此,最好将每个断言分为一个单独的测试。)
assert_equal(nil, RegexPractice.get_complex("abi"))
您的方法将返回0
,因为它仍然与"任何内容"匹配i
。
我的方法将返回nil
,因为它仅匹配"数字",其次是i
(例如-3+4i
);不是任意字符。
assert_equal(nil, RegexPractice.get_complex("65"))
您的方法应该在此处工作,除了一个小错误:因为您的正则以i*
结束,而不仅仅是i
,因此与" 0或更多i
S"匹配。换句话说,它仍然会匹配不包含i
的字符串。
我的方法没有这个错误。
通常,如果要将字符串转换为一个复杂的数字,则可以做:
Complex(string)
...如果这引起了例外,则字符串是一种无效的格式。
"num: -35+46i"
之类的输入通常将无效;因此,如果您想接受这些,那么您确实需要先执行某种正则查找。
您的测试失败的原因是您可能正在测试错误的事情。
RegexPractice.get_complex("num: -35+46i")
是 quest 返回0,因为您要匹配的模式:
/.*i*/
返回0 or more of any character
完整匹配的第一个索引,其次是0 or more i's
。
您可以使用Rubular来实时检查正则匹配,也可以在控制台中运行它:
irb >>> "num: -35+46i" =~ /.*i/
=> 0
如果您最终试图在任何给定的字符串中返回复数的第一个索引,则可能需要根据您的预期输入进行一些更复杂的模式匹配,即查找具有实际号码的+
或-
在左侧,右侧是一个复杂的数字。
最后,如果您只想创建并与复杂数字进行交互,则可能需要参考此文档。