我正在尝试使用一个简单的数学表达式字符串,删除所有空格,删除所有重复的运算符,转换为单个数字,然后进行评估。
例如,像“2 7 + * 3 * 95”这样的字符串应转换为“2 + 3 * 9”,然后评估为29。
这是我到目前为止所拥有的:
expression.slice!(/ /) # Remove whitespace
expression.slice!(/\A([\+\-\*\/]+)/) # Remove operators from the beginning
expression.squeeze!("0123456789") # Single digit numbers (doesn't work)
expression.squeeze!("+-*/") # Removes duplicate operators (doesn't work)
expression.slice!(/([\+\-\*\/]+)\Z/) # Removes operators from the end
puts eval expression
不幸的是,这不会产生单个数字,也不会像我预期的那样删除重复的运算符。有什么想法吗?
答案 0 :(得分:2)
"2 7+*3*95".gsub(/([0-9])[0-9 ]*/, '\1').gsub(/([\+\*\/\-])[ +\*\/\-]+/, '\1')
第一个正则表达式处理单位数字,第二个处理重复运算符。如果你真的想要,你可以把它浓缩成一个正则表达式。
这适用于快速而肮脏的解决方案,但正确的解析器可能会为您提供更好的服务。
答案 1 :(得分:0)
DATA.each { |expr|
expr.gsub!(%r'\s+', '')
expr.gsub!(%r'([*/+-])[*/+-]+', '\1')
expr.gsub!(%r'(\d)\d+', '\1')
expr.sub!(%r'\A[*/+-]+', '')
expr.sub!(%r'[*/+-]+\Z', '')
puts expr + ' = ' + eval(expr).to_s
}
__END__
2 7+*3*95
+-2 888+*3*95+8*-2/+435+-