如何在Ruby中的某个字符上切割或拆分字符串?

Jam*_*aal 4 ruby arrays string

如果我有一个类似下面的字符串,我将如何在每个第3个字符或任何其他指定的字符分割它?

b = "123456789"
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

b = ["123","456","789"]
Run Code Online (Sandbox Code Playgroud)

我尝试过使用这些方法: b.split("").each_slice(3).to_a

但结果如下: [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]

谢谢您的帮助!

Aru*_*hit 6

b = "123456789"
b.chars.each_slice(3).map(&:join)
# => ["123", "456", "789"]
Run Code Online (Sandbox Code Playgroud)


the*_*Man 6

我用的是:

b = "123456789"
b.scan(/.{3}/) # => ["123", "456", "789"]
Run Code Online (Sandbox Code Playgroud)

如果OP的样本长度不同,或者嵌入了"\n",则可以进行简单的修改:

b = "123456789"
b.scan(/.{1,3}/) # => ["123", "456", "789"]
b[0..-2].scan(/.{1,3}/) # => ["123", "456", "78"]
"#{ b }\n#{ b }".scan(/.{1,3}/) # => ["123", "456", "789", "123", "456", "789"]
Run Code Online (Sandbox Code Playgroud)

现在,如果在"3"边界上存在嵌入的"\n"NOT,则会断开:

"#{ b[0..-2] }\n#{ b }".scan(/.{1,3}/) # => ["123", "456", "78", "123", "456", "789"]
Run Code Online (Sandbox Code Playgroud)

但这远远超出了OP的简单规范,可以通过首先剥离新行来修复:

"#{ b[0..-2] }\n#{ b }".delete("\n").scan(/.{1,3}/) # => ["123", "456", "781", "234", "567", "89"]
Run Code Online (Sandbox Code Playgroud)

  • +1漂亮而优雅.如果`b.length%3!= 0`则不起作用,但这样做:`b.scan(/..?.?/)` (2认同)
  • "如果字符串中有"\n",则无效." 没有任何解决方案可以正常使用嵌入式新线路.我们按照OP提供的规范工作. (2认同)

Ser*_*sev 5

你几乎成功了.

b = "123456789"
b.split("").each_slice(3).map(&:join) # => ["123", "456", "789"]
Run Code Online (Sandbox Code Playgroud)


hir*_*lau 5

其他方式:

my_s, my_a = '123456789', []
my_a << my_s.slice!(0..2) until my_s.empty?
p my_a # => ["123", "456", "789"]
Run Code Online (Sandbox Code Playgroud)