Daniel Schierbeck wrote:
> ara.t.howard / noaa.gov wrote:
>> def snake_case string
>>   return string unless string =~ %r/[A-Z]/
>>   reversed_words = string.reverse.scan(%r/[A-Z]+|[^A-Z]*[A-Z]+?|[^A-Z]+/)
>>   reversed_words.reverse.map{|word| 
>> word.reverse.downcase}.join('_').gsub(%r/_+/,'_')

This is what I got:



   class String
     def snake_case
       return self unless self =~ /[A-Z]/
       split('_').map do |part|
         break "" if part.empty?
         reversed_words = part.reverse.scan(/[A-Z]+|[^A-Z]*[A-Z]+?|[^A-Z]+/)
         reversed_words.reverse.map do |word|
           word.reverse.downcase
         end.join('_')
       end.join('_')
     end
   end

   if $0 == __FILE__
     require 'test/unit'

     class SnakeCaseTest < Test::Unit::TestCase
       i = 0

       %w{Foo_bar Foo_Bar FOO_Bar FOO_bar FOO_BAR foo_Bar
       fooBar FooBar FooBAR FOOBar}.each do |str|
         define_method("test_#{i += 1}") do
           assert_equal "foo_bar", str.snake_case,
                                   "could not handle #{str}"
         end
       end

       %w{_foobar __foobar _foobar_ __foobar__
       foo_bar _foo_bar_ __foo_bar__}.each do |str|
         define_method("test_#{i += 1}") do
           assert_equal str, str.snake_case
         end
       end
     end
   end


Cheers,
Daniel