Ruby регулярное выражение, чтобы превратить snake_casing в PascalCasing?

Я создал веб-фреймворк, который использует следующую функцию:

def to_class(text)
    text.capitalize
    text.gsub(/(_|-)/, '')
end

Чтобы превратить имена каталогов, которые snake_cased или же hyphen-cased в PascalCased имена классов для вашего проекта.

Проблема в том, что функция только удалена _ а также -и не использует заглавную букву следующей буквы. С помощью .capitalize, или же .upcaseЕсть ли способ добиться создания вашего snake/hyphen_/-cased имена в собственном PascalCased имена классов?

4 ответа

Решение

Это разбивает строку в _ в массив; каждый член использует заглавные буквы и склеивает массив обратно в строку:

def to_pascal_case(str)
  str.split(/-|_/).map(&:capitalize).join
end

p to_pascal_case("snake_cased") #=>"SnakeCased"

Ваш код не работает по нескольким причинам:

  • Полученный объект метода capitalize отбрасывается - вы должны сделать что-то вроде text.capitalize! или же text = text.capitalize,
  • Но capitalize метод просто upcases первая буква строки, а не первая буква каждого слова.
gsub(/(?:^|[_-])([a-z])?/) { $1.upcase unless $1.nil? }

В Rails есть похожий метод, называемый camelize. Это в основном заглавные буквы каждой части строки, состоящей из [a-z0-9] и удаляет все остальное.

Вы, вероятно, можете сыграть в гольф на что-то меньшее, но:

txt = 'foo-bar_baz'
txt.gsub(/(?:^|[-_])([a-z])/) { |m| m.upcase }.gsub(/[-_]/, '') # FooBarBaz
Другие вопросы по тегам