我试图用正则表达式来解决逆波兰计算器的问题,但我有与转换的数学表达式为常规形式的问题。
我写:
puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')
其打印:
35 (29-1)(+5) *
预期
(35*((29-1)+5))
但我得到不同的结果。 我究竟做错了什么?
我试图用正则表达式来解决逆波兰计算器的问题,但我有与转换的数学表达式为常规形式的问题。
我写:
puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')
其打印:
35 (29-1)(+5) *
预期
(35*((29-1)+5))
但我得到不同的结果。 我究竟做错了什么?
我假设你的意思是你试过
puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')
^ ^
无论如何,你必须使用量词+
,而不是*
,因为否则你将匹配一个空字符串\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)".
...和,而不是使用gsub
,使用sub
在while
循环,当它检测到没有更多的替代可以做出退出。 否则,你将违反操作的顺序,这是非常重要的。 例如,看看这个Rubular演示 。 你可以看到,通过使用gsub
,你可能可能取代原子的第二个黑社会,“5 + *”,当一个真正的第二次迭代应该替换第一个三合一后替换一个“早”黑社会!
警告: -
减号)字符必须出现在第一个或最后一个字符类,因为否则会指定一个范围! (感谢@JoshuaCheek。)