从String中删除重复的数字和运算符

我正在尝试使用一个简单的数学表达式字符串,删除所有空格,删除所有重复的运算符,转换为单个数字,然后进行求值。

例如,类似“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 

不幸的是,这不会产生单个数字,也不会像我预期的那样删除重复的运算符。 有任何想法吗?

 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+- 
 "2 7+*3*95".gsub(/([0-9])[0-9 ]*/, '\1').gsub(/([\+\*\/\-])[ +\*\/\-]+/, '\1') 

第一个正则表达式处理单位数字的东西,第二个正则表达式处理重复运算符。 如果你真的想要,你可以将它压缩成一个正则表达式。

这适用于快速而肮脏的解决方案,但您可能会通过适当的解析器提供更好的服务。