Có bất kỳ chức năng sẵn sàng nào để chuyển đổi chuỗi trường hợp lạc đà thành chuỗi phân tách gạch dưới không?
Tôi muốn một cái gì đó như thế này:
"CamelCaseString".to_underscore
để trả về "camel_case_opes".
...
Có bất kỳ chức năng sẵn sàng nào để chuyển đổi chuỗi trường hợp lạc đà thành chuỗi phân tách gạch dưới không?
Tôi muốn một cái gì đó như thế này:
"CamelCaseString".to_underscore
để trả về "camel_case_opes".
...
Câu trả lời:
ActiveSupport của Rails thêm gạch dưới vào Chuỗi bằng cách sử dụng như sau:
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
Sau đó, bạn có thể làm công cụ thú vị:
"CamelCase".underscore
=> "camel_case"
tr("-","_")
thành tr("- ","_")
(không gian được thêm vào param đầu tiên), điều này cũng sẽ biến không gian thành dấu gạch dưới. Ngoài ra, tôi không nghĩ bạn thậm chí cần bao gồm self.
, hoặc ít nhất nó hoạt động với tôi theo Ruby 1.9.3.
require 'active_support/core_ext/string'
Bạn có thể dùng
"CamelCasedName".tableize.singularize
Hoặc chỉ
"CamelCasedName".underscore
Cả hai cách tùy chọn sẽ mang lại "camel_cased_name"
. Bạn có thể kiểm tra chi tiết hơn ở đây .
Thực hiện Ruby một lớp:
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
Vì thế "SomeCamelCase".to_underscore # =>"some_camel_case"
/([^A-Z])([A-Z]+)/
thay vào đó, để xử lý "ALLCAPS"
-> "allcaps"
thay vì"a_ll_ca_ps"
Có một phương thức sẵn có Rails gọi là 'gạch dưới' mà bạn có thể sử dụng cho mục đích này
"CamelCaseString".underscore #=> "camel_case_string"
Phương pháp 'gạch dưới' thường có thể được coi là nghịch đảo của 'camelize'
Đây là cách Rails thực hiện :
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
Người nhận chuyển đổi sang trường hợp con rắn: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
Đây là thư viện Hỗ trợ cho DataMapper và 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"
Kiểm tra snakecase từ Ruby Facets
Các trường hợp sau đây được xử lý, như được thấy dưới đây:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
Từ: https://github.com/rubyworks/facets/blob/master/lib/core/facets/opes/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 ngắn cho CamelCase khi bạn cũng có khoảng trắng (không hoạt động chính xác nếu bạn có một từ xen kẽ với chữ cái bắt đầu nhỏ):
a = "Test String"
a.gsub(' ', '').underscore
=> "test_string"
underscore
không phải là một phần của ruby
Trong trường hợp ai đó đang tìm kiếm trường hợp khi anh ta cần áp dụng dấu gạch dưới cho chuỗi có khoảng trắng và muốn chuyển đổi chúng thành dấu gạch dưới, bạn cũng có thể sử dụng cái gì đó như thế này
'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore
Hoặc chỉ sử dụng .parameterize ('_') nhưng hãy nhớ rằng cái này không được dùng nữa
'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore
Tôi muốn điều này:
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
Khỉ vá String
lớp. Có những lớp bắt đầu bằng hai hoặc nhiều chữ cái viết hoa.
"\1_\2"
thành '\1_\2'
nếu không bạn sẽ kết thúc "came\u0001_\u0002ase"
thay vì "camel_case"
Ruby 2.5 ... có thể cả những người khác nữa.