Frage Was ist der beste Weg, um eine Zeichenfolge in Stücke einer bestimmten Länge in Ruby zu hacken?


Ich habe nach einer eleganten und effizienten Methode gesucht, eine Zeichenfolge in Ruby in Teilstrings einer bestimmten Länge zu zerlegen.

Bisher war das Beste, was ich mir vorstellen konnte:

def chunk(string, size)
  (0..(string.length-1)/size).map{|i|string[i*size,size]}
end

>> chunk("abcdef",3)
=> ["abc", "def"]
>> chunk("abcde",3)
=> ["abc", "de"]
>> chunk("abc",3)
=> ["abc"]
>> chunk("ab",3)
=> ["ab"]
>> chunk("",3)
=> []

Vielleicht möchten Sie chunk("", n) zurückgeben [""] Anstatt von []. Wenn ja, füge das als erste Zeile der Methode hinzu:

return [""] if string.empty?

Würden Sie eine bessere Lösung empfehlen?

Bearbeiten

Danke an Jeremy Ruten für diese elegante und effiziente Lösung:

def chunk(string, size)
    string.scan(/.{1,#{size}}/)
end

76
2018-04-16 01:06


Ursprung


Antworten:


Benutzen String#scan:

>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,3}/)
=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]

137
2018-04-16 01:26



Hier ist ein anderer Weg, es zu tun:

"abcdefghijklmnopqrstuvwxyz".chars.to_a.each_slice(3).to_a.map {|s| s.to_s }

=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]


16
2018-02-04 20:04



Ich denke, das ist die effizienteste Lösung, wenn Sie wissen, dass Ihre Zeichenfolge ein Vielfaches der Chunk-Größe ist

def chunk(string, size)
    (string.length / size).times.collect { |i| string[i * size, size] }
end

und für Teile

def parts(string, count)
    size = string.length / count
    count.times.collect { |i| string[i * size, size] }
end

2
2017-07-26 14:00



test.split(/(...)/).reject {|v| v.empty?}

Die Zurückweisung ist notwendig, da sie ansonsten den Leerraum zwischen den Sätzen enthält. Mein Regex-Fu ist nicht ganz darauf eingestellt, wie ich das direkt von meinem Kopf aus beheben kann.


1
2018-04-16 01:20



Gibt es andere Einschränkungen, die Sie beachten? Sonst wäre ich sehr versucht, etwas Einfaches zu tun

[0..10].each {
   str[(i*w),w]
}

0
2018-04-16 01:15