我希望尽可能简单地将一个数字随机字符串(如“12345567”)拆分为数组[“12”、“345”、“567”]。基本上就是将一个数字转换为一个人类可读的数字数组,并在千、百万、十亿等位置进行拆分。我以前的解决方案是从前面而不是后面进行切割
"'12345567".to_s.scan(/.{1,#{3}}/) #> ["123","455","67"]
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
Array
xt0899hw2#
你可以试试下面的。
> "12345567".scan(/\d+?(?=(?:\d{3})*$)/) => ["12", "345", "567"]
\d+?将进行一个或多个数字的非贪婪匹配,所述数字后面必须是正好三个数字,零次或多次,并且进一步后面是一行的结尾。
\d+?
(?=..)
(?:\d{3})*
$
或
> "12345567".scan(/.{1,3}(?=(?:.{3})*$)/) => ["12", "345", "567"]
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"]
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
免责声明:没有测试任何性能(或尝试去一个明确的尾部递归)!只是一个替代探索。
odopli945#
很难说你想要什么,但也许:
"12345567".scan(/^..|.{1,3}/) => ["12", "345", "567"]
5条答案
按热度按时间to94eoyn1#
如果使用Rails,可以使用number_with_delimiter帮助器。
可以对逗号进行拆分,得到
Array
xt0899hw2#
你可以试试下面的。
\d+?
将进行一个或多个数字的非贪婪匹配,所述数字后面必须是正好三个数字,零次或多次,并且进一步后面是一行的结尾。\d+?
将执行一个或多个数字的non-greedy匹配。(?=..)
,称为positive lookahead assertion,其Assert匹配之后必须跟随,(?:\d{3})*
正好是三个数字的零或更多的次数。所以这将匹配一个空字符串或111或111111,如3的倍数。$
与最后存在的边界匹配的线锚的结束。或
ctehm74n3#
下面是一个非正则表达式解决方案:
另一个:
mu0hgdu04#
递归方法:
不过,这很难理解。也许可以使用更明确的代码布局:
免责声明:没有测试任何性能(或尝试去一个明确的尾部递归)!只是一个替代探索。
odopli945#
很难说你想要什么,但也许: