How to split string into 2 parts after certain position

后端 未结 6 1560
隐瞒了意图╮
隐瞒了意图╮ 2021-01-17 10:53

For example I have some random string:

str = \"26723462345\"

And I want to split it in 2 parts after 6-th char. How to do this correctly?

相关标签:
6条回答
  • 2021-01-17 11:13

    This should do it

    [str[0..5], str[6..-1]]
    

    or

     [str.slice(0..5), str.slice(6..-1)]
    

    Really should check out http://corelib.rubyonrails.org/classes/String.html

    0 讨论(0)
  • 2021-01-17 11:18
    _, part1, part2 = str.partition /.{6}/
    

    https://ruby-doc.org/core-1.9.3/String.html#method-i-partition

    0 讨论(0)
  • 2021-01-17 11:18

    Here's a reusable version for you:

    str       = "26723462345"
    n         = str.length
    boundary  = 6
    head      = str.slice(0, boundary) # => "267234" 
    tail      = str.slice(boundary, n) # => "62345" 
    

    It also preserves the original string, which may come in handy later in the program.

    0 讨论(0)
  • 2021-01-17 11:20

    Here’s on option. Be aware, however, that it will mutate your original string:

    part1, part2 = str.slice!(0...6), str
    
    p part1  # => "267234"
    p part2  # => "62345"
    p str    # => "62345"
    

    Update

    In the years since I wrote this answer I’ve come to agree with the commenters complaining that it might be excessively clever. Below are a few other options that don’t mutate the original string.

    Caveat: This one will only work with ASCII characters.

    str.unpack("a6a*")
    # => ["267234", "62345"]
    

    The next one uses the magic variable $', which returns the part of the string after the most recent Regexp match:

    part1, part2 = str[/.{6}/], $'
    p [part1, part2]
    # => ["267234", "62345"]
    

    And this last one uses a lookbehind to split the string in the right place without returning any extra parts:

    p str.split(/(?<=^.{6})/)
    # => ["267234", "62345"]
    
    0 讨论(0)
  • 2021-01-17 11:21

    As a fun answer, how about:

    str.split(/(^.{1,6})/)[1..-1]
    

    This works because split returns the capture group matches, in addition to the parts of the string before and after the regular expression.

    0 讨论(0)
  • 2021-01-17 11:22

    The best way IMO is string.scan(/.{6}/)

    irb(main)> str
    => "abcdefghijklmnopqrstuvwxyz"
    irb(main)> str.scan(/.{13}/)
    => ["abcdefghijklm", "nopqrstuvwxyz"]
    
    0 讨论(0)
提交回复
热议问题