時として荒れた作業が必要になることもありますw
一般的な法則(アルゴリズム)があるのかと思ったらどうもないようだ。
という訳で総務省のデータを活用すればそれっぽく動くものは出来た。
漏れがあると思うので気づいた方は教えて下さいm(_ _)m
require 'pp'
require 'tel_splitter'
pp TelSplitter.split("0688889999")
> ["06", "8888", "9999"]
※2013/02/16時点の情報を元にしています。
tel_splitter.rb
# encoding: utf-8
module TelSplitter
MAP = {
# 市外局番 , 市内局番の桁数のマップ
# http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html のデータを利用
# 固定電話以外の桁数は適当です...
'050' => 4, # IP電話
'070' => 4, # 携帯電話/PHS
'080' => 4, # 携帯電話
'090' => 4, # 携帯電話
'020' => 3, # その他
'0120' => 3, # その他
'0800' => 3, # その他
'0570' => 3, # その他
'0990' => 3, # その他
# 固定電話
'011' => 3, '0123' => 2, '0123' => 2,
'0123' => 2, '0124' => 2, '0125' => 2,
'0126' => 2, '01267' => 1, '0133' => 2,
# 長すぎるので中略
# https://gist.github.com/kennyj/4966002
# に全部のっけました。
'0987' => 2, '09912' => 1, '09913' => 1,
'099' => 3, '0993' => 2, '0993' => 2,
'099' => 3, '0994' => 2, '0994' => 2,
'0995' => 2, '0995' => 2, '0996' => 2,
'0996' => 2, '09969' => 1, '0997' => 2,
'0997' => 2, '0997' => 2, '0997' => 2,
'0997' => 2
}
# 市外局番長毎のマップを作成する
5.downto(2) do |i|
const_set("MAP_#{i}", MAP.reject { |k, v| k.length != i })
end
def self.split(tel)
# 市外局番の長いものから探していく
[MAP_5, MAP_4, MAP_3, MAP_2].each do |map|
len = map.first[0].length
if map.has_key?(tel[0, len])
len_2 = map[tel[0, len]] # 市内局番の長さ
return [tel[0, len], tel[len, len_2], tel[(len + len_2)..-1]]
end
end
# 見つからなかった(もしくは強制的に区切る)
return [tel, "", ""]
end
end