尝试用红宝石编程计算器,我想将所有内容放入数组中,以便我可以为数学符号编写单词。
answer ||= 0
puts "CALCULATE"
puts "#{answer}"
input = gets.chomp.split(/([\s\D])/)
# for test
puts "response #{input}"
puts "asdf" unless input.is_a? Array
puts "qwer array inputs: #{input.length}"
永远研究它,非常感谢
寻找
8*15 => ["8", "*", "15"]
eight times 15 => ["eight", "times", "15"]
8 divided by 15 => ["8", "divided", "by", "15"]
答案 0 :(得分:0)
您可以使用
re = /\s+|([^\d\s]+)/
puts "8*15".split(re).reject { |c| c.empty? }
请参阅IDEONE demo
\s+
匹配一个或多个空白符号(并且它们将被删除,因为我们不捕获此子模式)并且([^\d\s]+)
将匹配并且捕获 1+符号其他比数字和空白,并且在被捕获后将被输出。
使用.reject { |c| c.empty? }
,我们摆脱了结果数组中的空元素。
答案 1 :(得分:0)
Wiktor的答案很好,但为了完整起见,这里有一个替代方案:
expr = /[\S&&\D]+|\d+/
p "8*15".scan(expr)
# => ["8", "*", "15"]
p "eight times 15".scan(expr)
# => ["eight", "times", "15"]
p "eight divided by 15".scan(expr)
# => ["eight", "divided", "by", "15"]
不使用拆分字符串,而是使用String#scan
返回字符串的匹配部分。这里解析了正则表达式:
expr = /
[\S&&\D]+ # One or more characters that is neither whitespace nor a digit
| # ...or...
\d+ # One or more digits
/x
如果不熟悉,character class中的&&
是设置的交叉点运算符。 \S
是所有非空白字符的集合,\D
是所有非数字字符的集合,因此[\S&&\D]
匹配任何既不是空白也不是数字的字符。