Regexp问题涉及反向抛光计算器

时间:2012-09-06 05:19:23

标签: ruby regex calculator rpn

我正在尝试使用正则表达式来解决反向抛光计算器问题,但我遇到了将数学表达式转换为传统形式的问题。

我写道:

puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')

打印:

35 (29-1)(+5) *

预期

(35*((29-1)+5)) 

但我得到了不同的结果。我做错了什么?

1 个答案:

答案 0 :(得分:5)

我假设你的意思是你试过

puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')
                    ^           ^

无论如何,你必须使用量词+而不是*,否则你将匹配\d*的空字符串作为你的一个捕获,因此{{1} }:

(+5)

我会进一步扩展/约束表达式,如:

/(\d+) (\d+) (\W)/

...而不是使用/([\d+*\/()-]+)\s+([\d+*\/()-]+)\s+([+*\/-])/ | | | | | | | | | Valid operators, +, -, *, and /. | | | | | | | Whitespace. | | | | | Arbitrary atom, e.g. "35", "(29-1)", "((29-1)+5)". | | | Whitepsace. | Arbitrary atom, e.g. "35", "(29-1)", "((29-1)+5)". ,而是在gsub循环中使用sub,当它检测到不能再进行替换时退出。这非常重要,否则您将违反操作顺序。例如,看看this Rubular demo。你可以看到,使用while,你可能会替换第二个三元组原子,“5 + *”,当真正的第二次迭代应该替换“早期”三元组之后替换第一个黑社会!

警告: gsub(减号)字符必须在字符类中出现 first last ,否则它将会出现指定范围! (感谢@JoshuaCheek。)