Регулярное выражение Ruby для преобразования Snake_casing в PascalCasing?
-
12-12-2019 - |
Вопрос
Я создал веб-фреймворк, который использует следующую функцию:
def to_class(text)
text.capitalize
text.gsub(/(_|-)/, '')
end
Чтобы превратить имена каталогов, которые snake_cased
или hyphen-cased
в PascalCased
имена классов для вашего проекта.
Проблема в том, что функция удалена _
и -
, и не делает следующую букву заглавной.С использованием .capitalize
, или .upcase
, есть ли способ добиться того, чтобы ваш snake/hyphen_/-cased
имена в правильные PascalCased
имена классов?
Решение
Это разбивает строку с регистром _ на массив;записывает каждый элемент с заглавной буквы и склеивает массив обратно в строку:
def to_pascal_case(str)
str.split(/-|_/).map(&:capitalize).join
end
p to_pascal_case("snake_cased") #=>"SnakeCased"
Ваш код не работает по нескольким причинам:
- Полученный объект метода капитализации отбрасывается - вы должны сделать что -то вроде
text.capitalize!
илиtext = text.capitalize
. - Но
capitalize
метод простоupcase
S первая буква строки, а не первая буква каждого слова.
Другие советы
gsub(/(?:^|[_-])([a-z])?/) { $1.upcase unless $1.nil? }
В Rails есть аналогичный метод под названием верблюдствовать.По сути, он капитализирует каждую часть строки, состоящей из [a-z0-9]
и удаляет все остальное.
Вероятно, вы можете уменьшить его до чего-то меньшего, но:
txt = 'foo-bar_baz'
txt.gsub(/(?:^|[-_])([a-z])/) { |m| m.upcase }.gsub(/[-_]/, '') # FooBarBaz