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

时间:2010-02-14 06:01:59

标签: ruby regex

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

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

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

2 个答案:

答案 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+-