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



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

我写道:

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

打印:

35 (29-1)(+5) *

预期

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

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

我想你的意思是尝试

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

无论如何,您必须使用量词+而不是*,因为否则您将匹配d*的空字符串作为捕获之一,因此(+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)".

并且在检测到不能进行更多替换时退出的while循环中使用sub而不是使用gsub。这一点非常重要,否则,您将违反操作顺序。例如,看看这个Rubular演示。您可以看到,通过使用gsub,您可能会替换第二个原子三元组"5+*",而实际上,在替换第一个三元组之后,第二次迭代应该替换"早期"三元组

警告:-(减号)字符必须出现在字符类中的第一个最后,否则它将指定一个范围!(感谢@JoshuaCheek。)

最新更新