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。多么奇妙的解释啊!非常感谢你!解决了这么多问题!