我正在尝试使用正则表达式来解决反向抛光计算器问题,但我遇到了将数学表达式转换为传统形式的问题。
我写道:
puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')
打印:
35 (29-1)(+5) *
预期
(35*((29-1)+5))
但我得到了不同的结果。我做错了什么?
答案 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。)