Ruby regexp para transformar Snake_casing em PascalCasing?
-
12-12-2019 - |
Pergunta
Criei um framework web que usa a seguinte função:
def to_class(text)
text.capitalize
text.gsub(/(_|-)/, '')
end
Para transformar nomes de diretórios que são snake_cased
ou hyphen-cased
em PascalCased
nomes de classe para o seu projeto.
O problema é que a função só foi removida _
e -
, e não coloca a próxima letra em maiúscula.Usando .capitalize
, ou .upcase
, existe uma maneira de conseguir fazer o seu snake/hyphen_/-cased
nomes em nome próprio PascalCased
nomes de classes?
Solução
Isso divide a string _cased em uma matriz;coloca todos os membros em maiúscula e cola o array de volta em uma string:
def to_pascal_case(str)
str.split(/-|_/).map(&:capitalize).join
end
p to_pascal_case("snake_cased") #=>"SnakeCased"
Seu código não funciona por vários motivos:
- O objeto resultante do método de capitalização é descartado - você
deve fazer algo como
text.capitalize!
outext = text.capitalize
. - Mas o
capitalize
método apenasupcase
s a primeira letra da cadeia de caracteres, não a primeira letra de cada palavra.
Outras dicas
gsub(/(?:^|[_-])([a-z])?/) { $1.upcase unless $1.nil? }
Rails tem um método semelhante chamado camelizar.Basicamente, ele coloca em maiúscula cada parte da string que consiste em [a-z0-9]
e remove todo o resto.
Você provavelmente pode reduzir para algo menor, mas:
txt = 'foo-bar_baz'
txt.gsub(/(?:^|[-_])([a-z])/) { |m| m.upcase }.gsub(/[-_]/, '') # FooBarBaz