From: Daniel Schierbeck Date: 2006-08-20T20:00:13+09:00 Subject: Re: Convert "ThisIsSomeString" to "this_is_some_string"? 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