kowell24
kowell24

Reputation: 13

Ruby on Rails - How do I split string and Number?

I have a string "FooFoo2014".

I want the result to be => "Foo Foo 2014"

Any idea?

Upvotes: 1

Views: 1419

Answers (4)

kronn
kronn

Reputation: 965

Your example is a little generic. So this might be guessing in the wrong direction. That being said, it seems like you want to reformat the string a little:

 "FooFoo2014".scan(/^([A-Z].*)([A-Z].*\D*)(\d+)$/).flatten.join(" ")

As "FooFoo2014" is a string with some internal structure important to you, you need to come up with the right regular expression yourself.

From your question, I extract two tasks:

  1. split the FooFoo at the capital letter.

    /([A-Z].*)([A-Z].*)/ would do that, given you only have standard latin letters

  2. split the letter from the digits

    /(.*\D)(\d+)/ achieves that.

The result of scan is an array in my version of ruby. Please verify that in your setup.

If you think that regular expressions are too complicated for this, I suggest that you take a good look into ActiveSupport. http://api.rubyonrails.org/v3.2.1/ might help you.

Upvotes: 0

sawa
sawa

Reputation: 168081

"FooFoo2014"
.gsub(/(?<=\d)(?=\D)|(?<=\D)(?=\d)|(?<=[a-z])(?=[A-Z])/, " ")
# => "Foo Foo 2014"

Upvotes: 1

Martin
Martin

Reputation: 7714

If its only letters then only digits:

target = "FooFoo2014"
match_data = target.match(/([A-Za-z]+)(\d+)/)
p match_data[1] # => "FooFoo"
p match_data[2] # => "2014

If it is two words each made of one capitalized letter then lowercase letters, then digits:

target = "FooBar2014"
match_data = target.match(/([A-Z][a-z]+)([A-Z][a-z]+)(\d+)/)

p match_data[1] # => "Foo"
p match_data[2] # => "Bar"
p match_data[3] # => "2014

Better regex are probably possible.

Upvotes: -1

Alexander Kireyev
Alexander Kireyev

Reputation: 10825

This works fine:

puts "FooFoo2014".scan(/(\d+|[A-Z][a-z]+)/).join(' ')
# => Foo Foo 2014

Of course in condition that you separate numbers and words from capital letter.

Upvotes: 2

Related Questions