简体   繁体   中英

How to split a string in Ruby into two variables in one line of code?

In Ruby, how can I split a string into two variables in one line of code?

Example:

Goal: Split string s into variables a and b , such that a = 'A' and b = 123 .

irb(main):001:0> s = "A123" # Create string to split.
=> "A123"

irb(main):002:0> a, b = s.split(/\d/) # Extracts letter only.
=> ["A"]

irb(main):003:0> puts a # a got assigned 'A' as expected.
A
=> nil

irb(main):004:0> puts b # b did not get assigned the split remainder, '123'.
=> nil

irb(main):005:0> b = s.split(/\D/) # Extracts number only.
=> ["", "123"]

irb(main):006:0> puts b # Now b has the value I want it to have.
123
=> nil

How can the same result be achieved in one line of code?

There are many ways, eg positive lookbehind in this particular case would do:

a, b = 'A123'.split(/(?<=\D)/)
#⇒ ["A", "123"]

Positive lookahead with a limit of slices:

'AB123'.split(/(?=\d)/, 2)
#⇒ ["AB", "123"]

By indices:

[0..1, 2..-1].map &'AB123'.method(:[])
#⇒ ["AB", "123"]

Instead of splitting with lookaheads and lookbehinds, you may scan the string to tokenize it into digits and non-digits with /\\d+|\\D+/ :

"AB123".scan(/\d+|\D+/)
# => [AB, 123]

The pattern matches

  • \\d+ - 1 or more digits
  • | - or
  • \\D+ - 1 or more chars other than digit.

Another one via MatchData#to_a :

_, a, b = * "AB123".match(/(\D+)(\d+)/)
#=> ["AB123", "AB", "123"]

a #=> "AB"
b #=> "123"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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