Existe-t-il une fonction prête à convertir les chaînes de cas de chameau en chaîne séparée par des traits de soulignement?
Je veux quelque chose comme ça:
"CamelCaseString".to_underscore
pour retourner "camel_case_string".
...
Existe-t-il une fonction prête à convertir les chaînes de cas de chameau en chaîne séparée par des traits de soulignement?
Je veux quelque chose comme ça:
"CamelCaseString".to_underscore
pour retourner "camel_case_string".
...
Réponses:
ActiveSupport de Rails ajoute un trait de soulignement à la chaîne en utilisant ce qui suit:
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
Ensuite, vous pouvez faire des trucs amusants:
"CamelCase".underscore
=> "camel_case"
tr("-","_")à tr("- ","_")(espace ajouté au premier paramètre), cela transformera également les espaces en traits de soulignement. De plus, je ne pense pas que vous ayez même besoin d'inclure self., ou du moins cela fonctionne pour moi sous Ruby 1.9.3.
require 'active_support/core_ext/string'
Vous pouvez utiliser
"CamelCasedName".tableize.singularize
Ou juste
"CamelCasedName".underscore
Les deux options donneront des résultats "camel_cased_name". Vous pouvez vérifier plus de détails ici .
Implémentation Ruby à une ligne:
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
Alors "SomeCamelCase".to_underscore # =>"some_camel_case"
/([^A-Z])([A-Z]+)/plutôt de gérer "ALLCAPS"-> "allcaps"au lieu de"a_ll_ca_ps"
Il existe une méthode intégrée de Rails appelée «souligné» que vous pouvez utiliser à cette fin
"CamelCaseString".underscore #=> "camel_case_string"
La méthode de «soulignement» peut généralement être considérée comme l'inverse de «camelize»
Voici comment Rails procède :
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
Récepteur converti en étui serpent: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
Il s'agit de la bibliothèque de support pour DataMapper et 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"
Découvrez la snakecase de Ruby Facets
Les cas suivants sont traités, comme indiqué ci-dessous:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
De: 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 court pour CamelCases lorsque vous avez également des espaces (ne fonctionne pas correctement si vous avez un mot entre les deux avec une petite lettre de départ):
a = "Test String"
a.gsub(' ', '').underscore
=> "test_string"
underscorene fait pas partie de ruby
Dans le cas où quelqu'un cherche un cas quand il a besoin d'appliquer un trait de soulignement à une chaîne avec des espaces et que vous souhaitez les convertir en traits de soulignement, vous pouvez également utiliser quelque chose comme ceci
'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore
Ou utilisez simplement .parameterize ('_') mais gardez à l'esprit que celui-ci est obsolète
'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore
Je voudrais ceci:
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 de singe de Stringclasse. Il existe des classes qui commencent par deux lettres ou plus en majuscules.
"\1_\2"pour '\1_\2'sinon vous vous retrouverez avec "came\u0001_\u0002ase"au lieu "camel_case"de Ruby 2.5 ... peut-être d'autres aussi.