Ruby regexp, um snake_casing in PascalCasing umzuwandeln?
-
12-12-2019 - |
Frage
Ich habe ein Webframework erstellt, das die folgende Funktion verwendet:
def to_class(text)
text.capitalize
text.gsub(/(_|-)/, '')
end
Um Verzeichnisnamen zu ändern, die sind snake_cased
oder hyphen-cased
in PascalCased
klassennamen für Ihr Projekt.
Problem ist, die Funktion wurde nur entfernt _
und -
, und schreibt den nächsten Buchstaben nicht groß.Wobei .capitalize
, oder .upcase
, gibt es einen Weg zu erreichen, Ihre zu machen snake/hyphen_/-cased
namen in die richtige PascalCased
klassennamen?
Lösung
Dies teilt die Zeichenfolge _ in ein Array auf;schreibt jedes Mitglied groß und klebt das Array wieder an eine Zeichenfolge:
def to_pascal_case(str)
str.split(/-|_/).map(&:capitalize).join
end
p to_pascal_case("snake_cased") #=>"SnakeCased"
Ihr Code funktioniert aus mehreren Gründen nicht:
- Das resultierende Objekt der capitalize-Methode wird verworfen - Sie
sollte so etwas tun wie
text.capitalize!
odertext = text.capitalize
. - Aber die
capitalize
methode nurupcase
s der erste Buchstabe der Zeichenfolge, nicht der erste Buchstabe jedes Wortes.
Andere Tipps
gsub(/(?:^|[_-])([a-z])?/) { $1.upcase unless $1.nil? }
Rails hat eine ähnliche Methode namens camelize.Grundsätzlich wird jeder Teil der Zeichenfolge groß geschrieben, bestehend aus [a-z0-9]
und entfernt alles andere.
Sie können es wahrscheinlich auf etwas Kleineres reduzieren, aber:
txt = 'foo-bar_baz'
txt.gsub(/(?:^|[-_])([a-z])/) { |m| m.upcase }.gsub(/[-_]/, '') # FooBarBaz