Ruby 回答错误的计算器中的正则表达式

Ruby 回答错误的计算器中的正则表达式,ruby,regex,calculator,Ruby,Regex,Calculator,下面的代码是一个计算器脚本,我可以针对数学表达式运行它。输出明显错误。我认为它是无限循环的。如果有人能在这里发现错误,我将非常感激 我无法在解决方案中使用eval。你在这里看到的一般格式是我必须使用的。我还99%确定我也不能使用case语句 代码 expression = (ARGV[0]).gsub(/\s/, '') def theCalculator (expression) while expression =~ /\D/ if expression =~ /\(.*\)/

下面的代码是一个计算器脚本,我可以针对数学表达式运行它。输出明显错误。我认为它是无限循环的。如果有人能在这里发现错误,我将非常感激

我无法在解决方案中使用
eval
。你在这里看到的一般格式是我必须使用的。我还99%确定我也不能使用
case
语句

代码

expression = (ARGV[0]).gsub(/\s/, '')
def theCalculator (expression)
  while expression =~ /\D/
    if expression =~ /\(.*\)/
        expression = expression.scan(/\((.*)\)/)
        expression = $` + (theCalculator(expression)).to_s + $'
    elsif expression =~ /\^/
        expression = expression.scan(/(\d*|\d*\.\d*)(\^)(\d*|\d*\.\d*)/)
        expression = $1.to_f ** $3.to_f
        expression = $` + expression.to_s + $'
    elsif expression =~ /\*|\//
        expression = expression.scan(/(\d*|\d*\.\d*)(\*|\/)(\d*|\d*\.\d*)/)
        if $2 == "*"
          expression = $1.to_f * $3.to_f
        else
          expression = $1.to_f / $3.to_f
        end
      expression = $` + expression.to_s + $'
    elsif expression =~ /\+|\-/
      expression = expression.scan(/(\d*|\d*\.\d*)(\+|\-)(\d*|\d*\.\d*)/)
        if $2 == "+"
          expression = $1.to_f + $3.to_f
        else
          expression = $1.to_f - $3.to_f
        end
      expression = $` + expression.to_s + $'
    end
end
return expression
end
expression = theCalculator(expression)
puts expression
输入

ruby calc.rb "2 ^ (4 - 1.0) + 1"
(big ol infinite loop)
输出

ruby calc.rb "2 ^ (4 - 1.0) + 1"
(big ol infinite loop)

这是一个好的开始。还要知道,如果您觉得有必要以这种方式进行实验,那么有几个在线正则表达式评估器

只需给出几个非常重要的提示,这些提示将使您更接近自己完成任务:

  • 找到一种调试代码的方法!您已经知道
    put
    ,您可以从它开始
  • 仔细检查你的
    ,而
    状况(
    \D
    ):在我看来
    [^\D.]
    更好
  • 另外,我认为
    [*\/]
    [+-]
    可以分别取代
    \*\/
    \+-
  • 在递归调用中,我将
    .to_s
    添加到
    表达式
  • 注意贪婪:在帕伦斯匹配中使用懒惰量词
    编辑:使用表达式匹配没有任何内部参数的参数
  • \d*\d*.\d*
    \d*(?:\.\d*)?
请仔细阅读以上列表,并尝试理解我的建议。

你能让你的脚本给出和我一样的结果吗?(
9.0

这是一个很好的起点。还要知道,如果您觉得有必要以这种方式进行实验,那么有几个在线正则表达式评估器

只需给出几个非常重要的提示,这些提示将使您更接近自己完成任务:

  • 找到一种调试代码的方法!您已经知道
    put
    ,您可以从它开始
  • 仔细检查你的
    ,而
    状况(
    \D
    ):在我看来
    [^\D.]
    更好
  • 另外,我认为
    [*\/]
    [+-]
    可以分别取代
    \*\/
    \+-
  • 在递归调用中,我将
    .to_s
    添加到
    表达式
  • 注意贪婪:在帕伦斯匹配中使用懒惰量词
    编辑:使用表达式匹配没有任何内部参数的参数
  • \d*\d*.\d*
    \d*(?:\.\d*)?
请仔细阅读以上列表,并尝试理解我的建议。

你能让你的脚本给出和我一样的结果吗?(
9.0

^
在Bash中有特殊的含义,我假设您的shell就是这个意思。您需要转义它
\^
@squiguy您指的是输入字符串吗?是的,当您在命令行上键入计算时。在我的情况下,它将永远循环,我认为这不是显而易见的,但正则表达式“解析”必须是编写计算器最糟糕的方式。
^
在Bash中有特殊的意义,这就是我假设你的外壳。您需要对其进行转义
\^
@squiguy您指的是输入字符串吗?是的,当您在命令行上键入计算时。在我的情况下,它将永远循环,我认为这不是显而易见的,但正则表达式“解析”一定是编写计算器最糟糕的方式。很好的解释!)<代码>+1
。多么奇妙的解释啊!非常感谢你!解决了这么多问题!很好的解释!:)<代码>+1
。多么奇妙的解释啊!非常感谢你!解决了这么多问题!