Deve kasası dizelerini alt çizgi ayrılmış dizeye dönüştüren herhangi bir hazır fonksiyon var mı?
Böyle bir şey istiyorum:
"CamelCaseString".to_underscore
"camel_case_string" döndürmek için.
...
Deve kasası dizelerini alt çizgi ayrılmış dizeye dönüştüren herhangi bir hazır fonksiyon var mı?
Böyle bir şey istiyorum:
"CamelCaseString".to_underscore
"camel_case_string" döndürmek için.
...
Yanıtlar:
Rails ActiveSupport , aşağıdakileri kullanarak Dizeye alt çizgi ekler:
class String
def underscore
self.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
end
Sonra eğlenceli şeyler yapabilirsiniz:
"CamelCase".underscore
=> "camel_case"
tr("-","_")
için tr("- ","_")
(ilk param eklenen boşluk), bu da alt çizgi içine boşluk dönecek. Ayrıca, eklemeniz bile gerektiğini sanmıyorum self.
, ya da en azından benim için Ruby 1.9.3 altında çalışıyor.
require 'active_support/core_ext/string'
Kullanabilirsiniz
"CamelCasedName".tableize.singularize
Ya da sadece
"CamelCasedName".underscore
Her iki seçenek de verilecektir "camel_cased_name"
. Burada daha ayrıntılı bilgi kontrol edebilirsiniz burada .
Tek katmanlı Ruby uygulaması:
class String
# ruby mutation methods have the expectation to return self if a mutation occurred, nil otherwise. (see http://www.ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21)
def to_underscore!
gsub!(/(.)([A-Z])/,'\1_\2')
downcase!
end
def to_underscore
dup.tap { |s| s.to_underscore! }
end
end
Yani "SomeCamelCase".to_underscore # =>"some_camel_case"
/([^A-Z])([A-Z]+)/
yerine, "ALLCAPS"
"allcaps"
"a_ll_ca_ps"
Bu amaçla kullanabileceğiniz 'alt çizgi' adı verilen bir Rails dahili yöntemi vardır.
"CamelCaseString".underscore #=> "camel_case_string"
'Alt çizgi' yöntemi tipik olarak 'deve' ifadesinin tersi olarak düşünülebilir
İşte nasıl Raylar yapar :
def underscore(camel_cased_word)
camel_cased_word.to_s.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
Alıcı yılan kasasına dönüştürüldü: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
Bu, DataMapper ve Merb için Destek kütüphanesidir. ( http://rubygems.org/gems/extlib )
def snake_case
return downcase if match(/\A[A-Z]+\z/)
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
gsub(/([a-z])([A-Z])/, '\1_\2').
downcase
end
"FooBar".snake_case #=> "foo_bar"
"HeadlineCNNNews".snake_case #=> "headline_cnn_news"
"CNN".snake_case #=> "cnn"
Check out snakecase gelen Yakut YÖNÜ
Aşağıdaki durumlar, aşağıda görüldüğü gibi ele alınmaktadır:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
Gönderen: https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb
class String
# Underscore a string such that camelcase, dashes and spaces are
# replaced by underscores. This is the reverse of {#camelcase},
# albeit not an exact inverse.
#
# "SnakeCase".snakecase #=> "snake_case"
# "Snake-Case".snakecase #=> "snake_case"
# "Snake Case".snakecase #=> "snake_case"
# "Snake - Case".snakecase #=> "snake_case"
#
# Note, this method no longer converts `::` to `/`, in that case
# use the {#pathize} method instead.
def snakecase
#gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr('-', '_').
gsub(/\s/, '_').
gsub(/__+/, '_').
downcase
end
#
alias_method :underscore, :snakecase
# TODO: Add *separators to #snakecase, like camelcase.
end
"Dumb Penguin's Egg".snakecase # => "dumb_penguin's_egg"
Boşlukları da dahil ettiğinizde CamelCases için kısa oneliner (küçük bir başlangıç harfiyle aralarında bir kelime varsa doğru çalışmaz):
a = "Test String"
a.gsub(' ', '').underscore
=> "test_string"
underscore
Ruby'nin bir parçası değil
Birisinin boşluklu dizeye alt çizgi uygulaması gerektiğinde ve alt çizgilere dönüştürmek istediği durumda durum arayan bir kişi varsa, bunun gibi bir şey kullanabilirsiniz
'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore
Veya sadece .parameterize ('_') kullanın ancak bunun kullanımdan kaldırıldığını unutmayın
'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore
Bunu isterdim:
class String
# \n returns the capture group of "n" index
def snikize
self.gsub(/::/, '/')
.gsub(/([a-z\d])([A-Z])/, "\1_\2")
.downcase
end
# or
def snikize
self.gsub(/::/, '/')
.gsub(/([a-z\d])([A-Z])/) do
"#{$1}_#{$2}"
end
.downcase
end
end
Maymun yama String
sınıfı. Büyük harfle iki veya daha fazla harfle başlayan sınıf vardır.
"\1_\2"
için '\1_\2'
aksi takdirde ile bitireceğiz "came\u0001_\u0002ase"
yerine "camel_case"
Ruby 2.5 itibariyle ... belki diğerleri de.