Ruby Regex Complex Numbers



我有以下测试复数的代码:

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

如果您最终试图在任何给定的字符串中返回复数的第一个索引,则可能需要根据您的预期输入进行一些更复杂的模式匹配,即查找具有实际号码的+-在左侧,右侧是一个复杂的数字。

最后,如果您只想创建并与复杂数字进行交互,则可能需要参考此文档。

最新更新