首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将带有范围的值字符串转换为Ruby中的数组

如何将带有范围的值字符串转换为Ruby中的数组
EN

Stack Overflow用户
提问于 2018-04-08 13:26:44
回答 4查看 698关注 0票数 2

我试图解析一个由","加入的数字和范围字符串,并将其转换为一个数字数组。我把它作为输入:"1,3,6-8,5",并且希望有一个类似于这样的数组:[1,3,5,6,7,8]

我只能在没有范围的情况下这样做:

代码语言:javascript
运行
复制
"12,2,6".split(",").map { |s| s.to_i }.sort #=> [2, 6, 12]

在一定范围内,我做不到:

代码语言:javascript
运行
复制
a = "12,3-5,2,6"
b = a.gsub(/-/, "..")               #=> "12,3..5,2,6"
c = b.split(",")                    #=> ["12", "3..5", "2", "6"]
d = c.sort_by(&:to_i)               #=> ["2", "3..5", "6", "12"]
e = d.split(",").map { |s| s.to_i } #>> Error

我该怎么做?

我还在考虑在map中使用splat运算符,但是splat不接受像[*(3..5)]这样的字符串。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-08 15:48:16

代码语言:javascript
运行
复制
"12,3-5,2,6".
  gsub(/(\d+)-(\d+)/) { ($1..$2).to_a.join(',') }.
  split(',').
  map(&:to_i)
#⇒ [12, 3, 4, 5, 2, 6]
票数 4
EN

Stack Overflow用户

发布于 2018-04-08 13:42:19

代码语言:javascript
运行
复制
"1,3,6-8,5".split(',').map do |str|
  if matched = str.match(/(\d+)\-(\d+)/)
    (matched[1].to_i..matched[2].to_i).to_a
  else
    str.to_i
  end
end.flatten

代码语言:javascript
运行
复制
"1,3,6-8,5".split(',').each_with_object([]) do |str, output|
  if matched = str.match(/(\d+)\-(\d+)/)
    output.concat (matched[1].to_i..matched[2].to_i).to_a
  else
    output << str.to_i
  end
end

还是严格的

代码语言:javascript
运行
复制
RANGE_PATTERN = /\A(\d+)\-(\d+)\z/
INT_PATTERN   = /\A\d+\z/

"1,3,6-8,5".split(',').each_with_object([]) do |str, output|
  if matched = str.match(RANGE_PATTERN)
    output.concat (matched[1].to_i..matched[2].to_i).to_a

  elsif str.match(INT_PATTERN)
    output << str.to_i

  else
    raise 'Wrong format given'
  end
end
票数 3
EN

Stack Overflow用户

发布于 2018-04-08 17:58:20

代码语言:javascript
运行
复制
"1,3,6-8,5".split(',').flat_map do |s|
  if s.include?('-')
    f,l = s.split('-').map(&:to_i)
    (f..l).to_a
  else
    s.to_i
  end
end.sort
  #=> [1, 3, 5, 6, 7, 8]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49718344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档