書いてみました。
http://code.nanigac.com/source/view/733
不正値渡されるとエラー終了してしまいますが、とりあえずデバッグより睡眠を優先。
def tel_format(str) ptns = [ /^(1\d\d)$/, /^(0\d\d0)(\d{3})(\d+)$/, /^(0\d0)(\d+)(\d{4})$/, /^(\d{4})(\d+)(\d{4})$/, /^(\d+)(\d{4})$/ ] ptns.each{|ptn| if ptn =~ str matches = Regexp.last_match.captures # _, *matches = *$~ return sprintf(["%s", "%s-%s", "(%s)%s-%s"][matches.length - 1], *matches) end } return end ["11","110","02202222","0303333333","44444444444","55555"].each{|n| puts tel_format(n) }
実行
$ ruby tel_format.rb nil 110 (0220)222-2 (030)333-3333 (4444)444-4444 5-5555