Ruby on Rails — как мне разделить строку и число?

#ruby #ruby-on-rails-3

#ruby #ruby-on-rails-3

Вопрос:

У меня есть строка "FooFoo2014" .

Я хочу, чтобы результат был => "Foo Foo 2014"

Есть идеи?

Комментарии:

1. Всегда ли ввод фиксирован? Никогда не FooBaaz2014? или что-то в этом роде?

2. Что превращает «FooFoo» в «Foo Foo»? Это заглавные буквы? Разделить пополам? Каждая третья буква — это новое слово?

Ответ №1:

Это работает нормально:

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

Конечно, при условии, что вы отделяете цифры и слова от заглавной буквы.

Ответ №2:

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

Ответ №3:

Ваш пример немного общий. Так что это может быть предположение в неправильном направлении. При этом, похоже, вы хотите немного переформатировать строку:

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

Поскольку "FooFoo2014" для вас важна строка с некоторой внутренней структурой, вам нужно самостоятельно придумать правильное регулярное выражение.

Из вашего вопроса я извлекаю две задачи:

  1. разделите FooFoo на заглавную букву.

    /([A-Z].*)([A-Z].*)/ сделал бы это, учитывая, что у вас есть только стандартные латинские буквы

  2. отделите букву от цифр

    /(.*D)(d )/ достигает этого.

Результатом сканирования является массив в моей версии ruby. Пожалуйста, проверьте это в вашей настройке.

Если вы считаете, что регулярные выражения слишком сложны для этого, я предлагаю вам внимательно изучить ActiveSupport . http://api.rubyonrails.org/v3.2.1 / может помочь вам.

Ответ №4:

Если это только буквы, то только цифры:

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

Если это два слова, каждое из которых состоит из одной заглавной буквы, затем строчных букв, затем цифр:

 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
 

Вероятно, возможно лучшее регулярное выражение.