在空格和非数字处分开...包括非数字分隔符,不包括空格分隔符

时间:2016-03-18 15:38:18

标签: ruby regex

尝试用红宝石编程计算器,我想将所有内容放入数组中,以便我可以为数学符号编写单词。

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"]

2 个答案:

答案 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]匹配任何既不是空白也不是数字的字符。