繁体   English   中英

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

[英]How do you slice or split a string on a certain character in Ruby?

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

b = "123456789"

结果是这样的:

b = ["123","456","789"]

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

但它导致: [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]

谢谢您的帮助!

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

我用的是:

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

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

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

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

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

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

你几乎成功了。

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

其他方式:

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

这不会创建临时数组,适用于任何集合和字符数,并且不使用慢速正则表达式。 虽然不那么优雅。

s = "1234567"
(0...s.size / 3).map { |i| s[i * 3, 3] }
# => ["123", "456", "7"]

基准测试:

require "benchmark"

N = 100000

Benchmark.bm do |x|
    b = "123456789"
    x.report { N.times { (0...b.size / 3).map { |i| b[i * 3, 3] } } }
    x.report { N.times { b.scan(/.{3}/) } }
    x.report { N.times { b.chars.each_slice(3).map(&:join) } }
    x.report { N.times { b.split("").each_slice(3).map(&:join) } }
end

结果:

$ ruby split3.rb
       user     system      total        real
   0.080000   0.000000   0.080000 (  0.079944)
   0.130000   0.000000   0.130000 (  0.127715)
   0.300000   0.000000   0.300000 (  0.299186)
   0.640000   0.000000   0.640000 (  0.641817)

我试图改变线的顺序,看看是否有任何奇怪的副作用。 结果是一致的。 订单无关紧要。

除了其他的答案,如果你想拆就任意字符集(这个答案并不包括每三个字符,因为有足够多的答案,更在已经),并决定在哪里分裂人物走了,你也可以使用如此split

# Split and include splitting character in next slice
"123456789".split(/(?=[36])/)     # => ["12", "345", "6789"]

# Split and include splitting character in slice
"123456789".split(/(?<=[36])/)    # => ["123", "456", "789"]

# Split and exclude character from slices
"123456789".split(/[36]/)         # => ["12", "45", "789"]

请记住,这确实使用了正则表达式,为了您的目的,最好找到一种方法来使用较少的过度路线来分割字符串(请参阅detunized的答案,这是相当简洁和合理的方式处理这个(事情)。 根据要拆分的字符串的复杂性,拆分的内容,拆分字符/短语/等等,您的方法可能会发生变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM