Daniel Schierbeck 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
···
ara.t.howard@noaa.gov wrote: