Кратчайший путь в Ruby для преобразования "Джона Ди Белло" в "Джона Ди Белло" - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь найти наиболее эффективный способ в Ruby для преобразования String "John Di Bello" в "John DI BELLO".

В основном мне нужно capitalize для имени, котороевсегда первое слово и upcase на фамилию, которая также может состоять из двух слов.

В данный момент я пишу все с ног на голову

authors = ['John Di Bello', 'Terry Payton']
authors.map { |a| a.upcase }
#=> ['JOHN DI BELLO', 'TERRY PAYTON']

Я не могу найти легкий способПрописать первое слово в каждом элементе массива.

Ответы [ 4 ]

0 голосов
/ 29 сентября 2018

Где возможно, я предпочитаю модифицировать строки на месте, а не преобразовывать их в массивы, модифицировать массив и затем объединять результаты обратно в строку (возможно, foible ).Кроме того, в 2018 году мы не должны поддерживать Unicode? 1

def capitalize_then_upcase(str)
  str.gsub(/\p{Alpha}+/).with_index { |s,i| i.zero? ? s.capitalize : s.upcase }
end

arr = ['JohN di Bello', 'Hopalong Cassidy', 'Franz Josef Strauß']

arr.map { |str| capitalize_then_upcase(str) }
  #=> ["John DI BELLO", "Hopalong CASSIDY", "Franz JOSEF STRAUSS"]

При этом используется форма String # gsub , где перечислитель возвращается при наличиинет блока.

\p{Alpha} можно заменить на [[:alpha:]].Обе соответствуют буквам Юникода (прописные и строчные).Для получения документации ищите их как строки в Regexp .

1.См. эту статью , касающуюся String # upcase (и предположительно String # прописные буквы ) поддержки Unicode.

0 голосов
/ 28 сентября 2018

Другой вариант, карта с:

string.partition(' ').first + string.partition(' ')[1..-1].join.upcase

Итак, он становится:

array.map { |s| s.partition(' ').first + s.partition(' ')[1..-1].join.upcase }
0 голосов
/ 29 сентября 2018

Я хотел бы остановиться на mudasob был ответ , так как использование lower в этом сценарии может быть немного загадочным.Более выразительный способ написания решения может быть таким:

authors = ['John Di Bello', 'Terry Payton']

authors.map do |name|
  first_name, last_name = name.split(' ', 2)
  "#{first_name.capitalize} #{last_name.upcase}"
end
#=> ["John DI TRI BELLO", "Terry PAYTON"]

Вы можете заключить first_name, last_name = ... в скобки, чтобы прояснить, что вы используете декомпозицию массива, например.(first_name, last_name) = ... но это не обязательно.

Ссылки:

0 голосов
/ 28 сентября 2018

Разделите его, используйте заглавные буквы и , затем присоединитесь к нему.

['John Di Tri Bello', 'Terry Payton'].map do |s|
  s.
    split(/\s+/, 2).
    reduce { |n, s| [n.capitalize, s.upcase] }.
    join(' ')
end
#⇒ ["John DI TRI BELLO", "Terry PAYTON"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...