Apakah ada fungsi siap yang mengubah Strings case unta menjadi string dipisahkan garis bawah?
Saya ingin sesuatu seperti ini:
"CamelCaseString".to_underscore
untuk mengembalikan "camel_case_string".
...
Apakah ada fungsi siap yang mengubah Strings case unta menjadi string dipisahkan garis bawah?
Saya ingin sesuatu seperti ini:
"CamelCaseString".to_underscore
untuk mengembalikan "camel_case_string".
...
Jawaban:
ActiveSupport Rails menambahkan garis bawah pada String menggunakan yang berikut ini:
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
Maka Anda dapat melakukan hal-hal menyenangkan:
"CamelCase".underscore
=> "camel_case"
tr("-","_")
ke tr("- ","_")
(spasi ditambahkan ke param pertama), ini juga akan mengubah spasi menjadi garis bawah. Juga, saya pikir Anda bahkan tidak perlu memasukkan self.
, atau setidaknya itu berfungsi untuk saya di Ruby 1.9.3.
require 'active_support/core_ext/string'
Kamu bisa memakai
"CamelCasedName".tableize.singularize
Atau hanya
"CamelCasedName".underscore
Kedua opsi cara akan menghasilkan "camel_cased_name"
. Anda dapat memeriksa detail lebih lanjut di sini .
Implementasi Ruby satu lapis:
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
Begitu "SomeCamelCase".to_underscore # =>"some_camel_case"
/([^A-Z])([A-Z]+)/
, untuk menangani "ALLCAPS"
-> "allcaps"
alih-alih"a_ll_ca_ps"
Ada metode inbuilt Rails yang disebut 'garis bawah' yang dapat Anda gunakan untuk tujuan ini
"CamelCaseString".underscore #=> "camel_case_string"
Metode 'garis bawah' biasanya dapat dianggap sebagai kebalikan dari 'camelize'
Begini cara Rails melakukannya :
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
Penerima dikonversi menjadi kotak ular: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
Ini adalah perpustakaan Dukungan untuk DataMapper dan Merb. ( 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"
Lihat snakecase dari Ruby Facets
Kasus-kasus berikut ditangani, seperti yang terlihat di bawah ini:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
Dari: 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"
Oneliner singkat untuk CamelCases ketika Anda memiliki spasi juga termasuk (tidak berfungsi dengan benar jika Anda memiliki kata peralihan dengan huruf awal kecil):
a = "Test String"
a.gsub(' ', '').underscore
=> "test_string"
underscore
bukan bagian dari ruby
Jika seseorang mencari kasus ketika dia perlu menerapkan garis bawah untuk merangkai dengan spasi dan ingin mengubahnya menjadi garis bawah juga Anda dapat menggunakan sesuatu seperti ini
'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore
Atau cukup gunakan .parameterize ('_') tetapi perlu diingat bahwa ini sudah usang
'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore
Saya ingin ini:
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
Patch String
kelas monyet . Ada kelas yang dimulai dengan dua atau lebih huruf dalam huruf besar.
"\1_\2"
agar '\1_\2'
Anda tidak akan berakhir dengan "came\u0001_\u0002ase"
bukannya "camel_case"
Ruby 2.5 ... mungkin orang lain juga.