#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"
для вас важна строка с некоторой внутренней структурой, вам нужно самостоятельно придумать правильное регулярное выражение.
Из вашего вопроса я извлекаю две задачи:
- разделите FooFoo на заглавную букву.
/([A-Z].*)([A-Z].*)/
сделал бы это, учитывая, что у вас есть только стандартные латинские буквы - отделите букву от цифр
/(.*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
Вероятно, возможно лучшее регулярное выражение.