function snakecase(str)
str = replace(str, r"(?<a>[a-z])(?<b>[A-Z])" => s"\g<a>_\g<b>")
str = replace(str, "-" => "_")
str = replace(str, r"\s+" => "_")
return lowercase(str)
end
snakecase("FOOBAR") # => foobar
snakecase("FOO-BAR") # => foo_bar
snakecase("FooBAR") # => foo_bar
snakecase("foo Bar") # => foo_bar
replace 関数で置換する際は、(?<name>) でキャプチャして、\g<name> で展開する。