ruby 从后面将字符串拆分为3个字符数组

ycl3bljg  于 2022-11-22  发布在  Ruby
关注(0)|答案(5)|浏览(157)

我希望尽可能简单地将一个数字随机字符串(如“12345567”)拆分为数组[“12”、“345”、“567”]。基本上就是将一个数字转换为一个人类可读的数字数组,并在千、百万、十亿等位置进行拆分。
我以前的解决方案是从前面而不是后面进行切割

"'12345567".to_s.scan(/.{1,#{3}}/)
#> ["123","455","67"]
to94eoyn

to94eoyn1#

如果使用Rails,可以使用number_with_delimiter帮助器。

require 'action_view'
require 'action_view/helpers'
include ActionView::Helpers::NumberHelper

number_with_delimiter("12345567", :delimiter => ',')
# => "12,345,567"

可以对逗号进行拆分,得到Array

xt0899hw

xt0899hw2#

你可以试试下面的。

> "12345567".scan(/\d+?(?=(?:\d{3})*$)/)
=> ["12", "345", "567"]

\d+?将进行一个或多个数字的非贪婪匹配,所述数字后面必须是正好三个数字,零次或多次,并且进一步后面是一行的结尾。

  • \d+?将执行一个或多个数字的non-greedy匹配。
  1. (?=..),称为positive lookahead assertion,其Assert匹配之后必须跟随,
  2. (?:\d{3})*正好是三个数字的零或更多的次数。所以这将匹配一个空字符串或111或111111,如3的倍数。
  3. $与最后存在的边界匹配的线锚的结束。

> "12345567".scan(/.{1,3}(?=(?:.{3})*$)/)
=> ["12", "345", "567"]
ctehm74n

ctehm74n3#

下面是一个非正则表达式解决方案:

s = "12345567"

sz = s.size
n_first = sz % 3
((n_first>0) ? [s[0,n_first]] : []) + (n_first...sz).step(3).map { |i| s[i,3] }
  #=> ["12", "345", "567"]

另一个:

s.reverse.chars.each_slice(3).map { |a| a.join.reverse }.reverse
  #=> ["12", "345", "567"]
mu0hgdu0

mu0hgdu04#

递归方法:

def split(str)
  str.size <= 3 ? [str] : (split(str[0..-4]) + [str[-3..-1]])
end

不过,这很难理解。也许可以使用更明确的代码布局:

def split(str)
  if str.size <= 3 then
    [str]  # Too short, keep it all.
  else
    split(str[0..-4]) + [str[-3..-1]] # Append the last 3, and recurse on the head.
  end
end

免责声明:没有测试任何性能(或尝试去一个明确的尾部递归)!只是一个替代探索。

odopli94

odopli945#

很难说你想要什么,但也许:

"12345567".scan(/^..|.{1,3}/)
=> ["12", "345", "567"]

相关问题