ऊंट मामले को माणिक में अंडरस्कोर केस में बदलना


232

क्या कोई रेडी फंक्शन है जो ऊंट केस स्ट्रिंग्स को अंडरस्कोर पृथक स्ट्रिंग में परिवर्तित करता है?

मुझे कुछ इस तरह चाहिए:

"CamelCaseString".to_underscore      

"camel_case_string" वापस करने के लिए।

...


43
FYI करें: लोअरकेस और अंडरस्कोर को "आधिकारिक तौर पर" कहा जाता है जिसे सांप का मामला कहा जाता है
एंड्रयू

3
यह उद्धरण चिह्नों में "आधिकारिक तौर पर" देखकर अजीब है, और फिर भी, यह वर्णन करने का सबसे अच्छा तरीका है।
स्टीवेंसपिल

किसी कारण से मुझे snakecase विधि याद आ रही है। रेल्स 4.
अब्राम

जवाबों:


362

रेल्स 'ActiveSupport स्ट्रिंग का उपयोग करके अंडरस्कोर जोड़ता है:

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

फिर आप मज़ेदार चीज़ें कर सकते हैं:

"CamelCase".underscore
=> "camel_case"

5
आप को बदलते हैं tr("-","_")करने के लिए tr("- ","_")(प्रथम परम को जोड़ा गया अंतरिक्ष), यह भी अंडरस्कोर में रिक्त स्थान हो जाएगा। इसके अलावा, मुझे नहीं लगता कि आपको इसे शामिल करने की आवश्यकता है self.या कम से कम यह मेरे लिए रूबी 1.9.3 के तहत काम करता है।
गूस शोर्टज़

6
require 'active_support/core_ext/string'
konsolebox

अंडरस्कोर फ़ंक्शन सक्रिय उपयोग करता है: github.com/rails/rails/blob/…
GreeKrrina

अंडरस्कोर रूबी की विधि है जो रूबी नहीं है, एपिडॉक . com/rails/String/underscore देखें ।
यादव

1
@ एस.यादव सच्चा तरीका एक रेल है, इसलिए आप डिफ़ॉल्ट रूप से अंडरस्कोर नहीं कह सकते हैं, लेकिन उपयोग किए गए कोड प्रदान करके और रेल का स्रोत बताकर यह उत्तर माणिक के लिए एक अच्छा है, यह कहता है कि आप रेल को शामिल कर सकते हैं, या बस इस फ़ंक्शन को शामिल करें जो रेल टीम ने लिखा है और परीक्षण किया है।
माइकल गोर्मन

99

आप उपयोग कर सकते हैं

"CamelCasedName".tableize.singularize

या केवल

"CamelCasedName".underscore

दोनों विकल्प तरीके से उपज होगी "camel_cased_name"। आप इसे यहाँ और अधिक विवरण देख सकते हैं


11
यह ActiveSupport :: Inflector के कार्यान्वयन का एक हिस्सा है, इसके बिना, आप उन स्ट्रिंग एक्सटेंशन (शुद्ध irb कंसोल में प्रयास करें: "ThisCamelCaseString" .underscore का उपयोग नहीं कर सकते हैं, फिर 'active_support / infinor' की आवश्यकता है और फिर से प्रयास करें)
Evgenia Manolova

3
ओपी का लेबल "रूबी-ऑन-रेल्स" कहता है
जूलियन लैमरचे जूल

55

वन-लाइनर रूबी कार्यान्वयन:

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

इसलिए "SomeCamelCase".to_underscore # =>"some_camel_case"


2
कैसे अन्य समाधान शुद्ध रूबी नहीं हैं?
बजे

ओह, श ... धन्यवाद - मुझे पढ़ने में लिखने से ज्यादा दिलचस्पी थी। परिणामस्वरूप - रेल पर लिंक ने मुझे लगता है कि उन अन्य स्निपेट्स को रेल-विशिष्ट होना चाहिए। बदला हुआ जवाब ...
kirushik

1
मेरे संपादन में एक और त्रुटि है, और यह प्रकट नहीं होता है कि मैं इसे ठीक कर सकता हूं। यहाँ सही कोड है: gist.github.com/4027440
टिम हार्पर

6
आप /([^A-Z])([A-Z]+)/इसके बजाय विचार करना चाहते हैं , संभाल कर सकते हैं "ALLCAPS"-> "allcaps"इसके बजाय"a_ll_ca_ps"
नेवरी

4
यह वास्तव में एक 10-लाइनर है!
२५:१६ को

30

एक रेल्स इनबिल्ट विधि है जिसे 'अंडरस्कोर' कहा जाता है जिसे आप इस उद्देश्य के लिए उपयोग कर सकते हैं

"CamelCaseString".underscore #=> "camel_case_string" 

'अंडरस्कोर' पद्धति को आम तौर पर 'ऊंट' के उलटा माना जा सकता है


1
"..." के लिए अपरिभाषित विधि 'अंडरस्कोर': स्ट्रिंग
डोरियन

5
यह एक ActiveSupport तरीका है
डोरियन

20

यहाँ है कि कैसे रेल करता है :

   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

1
कोर स्ट्रिंग कक्षा पर आक्रमण करने के बजाय एक विधि तर्क के रूप में ऑपरैंड को बेहतर करना।
पिस्टन

1
सहमत न हों - बेहतर होगा कि इसे कक्षा पर संचालित किया जाए, जैसे कि यह होना चाहिए, अन्यथा आपको इसे एक मॉड्यूल में रखना होगा और जहां भी आपको इसकी आवश्यकता होगी, इसे शामिल करना याद रखें।
घोटी

1
इसके अलावा यह विधि वैसे भी रेल 3 के तार का हिस्सा है :)
घोटी

2
अगर मैं इस बहस में कूद सकता हूं - जब आप इसे शामिल करते हैं तो बेहतर होगा कि आप स्ट्रिंग क्लास पर आक्रमण करें =)।
इवान मोरन

7

रिसीवर सांप के मामले में परिवर्तित हो गया: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method

यह DataMapper और 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"

7

की जाँच करें snakecase सेरूबी पहलुओं

निम्नलिखित मामलों को संभाला जाता है, जैसा कि नीचे देखा गया है:

"SnakeCase".snakecase         #=> "snake_case"
"Snake-Case".snakecase        #=> "snake_case"
"Snake Case".snakecase        #=> "snake_case"
"Snake  -  Case".snakecase    #=> "snake_case"

प्रेषक: 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

यह विशेष चरित्र के साथ एक स्ट्रिंग के साथ काम नहीं करता है। Ex:"Dumb Penguin's Egg".snakecase # => "dumb_penguin's_egg"
खियाव रेय

6

जब आपके पास रिक्त स्थान होते हैं, तो कैमलकेस के लिए लघु ऑन्लाइनर (छोटे अक्षर के अक्षर के साथ आपके पास कोई शब्द नहीं है, तो सही तरीके से काम नहीं करता है):

a = "Test String"
a.gsub(' ', '').underscore

  => "test_string"

1
underscoreरूबी का हिस्सा नहीं है
dft

4

किसी मामले में जब वह रिक्त स्थान के साथ स्ट्रिंग को अंडरस्कोर लगाने की आवश्यकता के मामले में देख रहा है और उन्हें अंडरस्कोर में बदलना चाहता है, तो आप इस तरह से कुछ का उपयोग कर सकते हैं

'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore

या बस .parameterize ('_') का उपयोग करें, लेकिन ध्यान रखें कि यह एक पदावनत है

'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore

1

मुझे यह पसंद है:

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

Stringक्लास का बंदर पैच । ऐसे वर्ग हैं जो अपरकेस में दो या अधिक अक्षरों से शुरू होते हैं।


आप परिवर्तन करने की आवश्यकता है "\1_\2"के लिए '\1_\2'अन्यथा आप के साथ खत्म हो जाएगा "came\u0001_\u0002ase"के बजाय "camel_case"रूबी 2.5 के रूप में ... शायद साथ ही दूसरों।
6 फीट डेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.