Skip to content

Instantly share code, notes, and snippets.

@zakuroishikuro
Created January 24, 2016 00:10
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zakuroishikuro/e816827a9593c4472109 to your computer and use it in GitHub Desktop.
Save zakuroishikuro/e816827a9593c4472109 to your computer and use it in GitHub Desktop.
住所を都道府県 / 市区町村 / 町域名に分ける正規表現
require 'csv'
# 郵便局のサイトから郵便番号データをダウンロードしておく
# 同じフォルダ内のKEN_ALL.csvを読み込む
csv_path = File.expand_path("../KEN_ALL.CSV", __FILE__)
# 市区町村を取得
cities = CSV.read(csv_path, encoding:"Shift_JIS:UTF-8").transpose[7].uniq
# 最後の文字以外に「市・区・町・村」があれば、その文字までの最長の文字列を取得
res = cities.map{|city| city[/.+[市区町村](?=.*.$)/] }.compact.uniq
# 文字コード順にソートして、逆純にして結合
# 逆順にしているのは、(余市郡余市|余市)みたいになってる場合に前の文字列をヒットさせるため
exceptions = res.sort.reverse * "|"
#=> 高市|静岡市|野々市|西村|西八代郡市|芳賀郡市|羽村|福岡市|神戸市|神崎郡市|相模原市|田村|熊本市|浜松市|武蔵村|横浜市|柴田郡村|杵島郡大町|東村|札幌市|新潟市|廿日市|広島市|川崎市|岡山市|大阪市|大町|大村|堺市|四日市|名古屋市中村|名古屋市|吉野郡下市|千葉市|十日町|北村|北九州市|余市郡余市|余市|佐波郡玉村|仙台市|京都市|中新川郡上市|さいたま市
# 正規表現を作成
# どうしてこの正規表現になるかはそのうちQiitaとかに書きたい
puts "(.{2,3}?[都道府県])((?:#{exceptions}|.)?.*?[市区町村])(.*)"
#=> (.{2,3}?[都道府県])((?:高市|静岡市|野々市|西村|西八代郡市|芳賀郡市|羽村|福岡市|神戸市|神崎郡市|相模原市|田村|熊本市|浜松市|武蔵村|横浜市|柴田郡村|杵島郡大町|東村|札幌市|新潟市|廿日市|広島市|川崎市|岡山市|大阪市|大町|大村|堺市|四日市|名古屋市中村|名古屋市|吉野郡下市|千葉市|十日町|北村|北九州市|余市郡余市|余市|佐波郡玉村|仙台市|京都市|中新川郡上市|さいたま市|.)?.*?[市区町村])(.*)
(.{2,3}?[都道府県])((?:高市|静岡市|野々市|西村|西八代郡市|芳賀郡市|羽村|福岡市|神戸市|神崎郡市|相模原市|田村|熊本市|浜松市|武蔵村|横浜市|柴田郡村|杵島郡大町|東村|札幌市|新潟市|廿日市|広島市|川崎市|岡山市|大阪市|大町|大村|堺市|四日市|名古屋市中村|名古屋市|吉野郡下市|千葉市|十日町|北村|北九州市|余市郡余市|余市|佐波郡玉村|仙台市|京都市|中新川郡上市|さいたま市|.)?.*?[市区町村])(.*)
var rex = /(.{2,3}?[都道府県])((?:高市|静岡市|野々市|西村|西八代郡市|芳賀郡市|羽村|福岡市|神戸市|神崎郡市|相模原市|田村|熊本市|浜松市|武蔵村|横浜市|柴田郡村|杵島郡大町|東村|札幌市|新潟市|廿日市|広島市|川崎市|岡山市|大阪市|大町|大村|堺市|四日市|名古屋市中村|名古屋市|吉野郡下市|千葉市|十日町|北村|北九州市|余市郡余市|余市|佐波郡玉村|仙台市|京都市|中新川郡上市|さいたま市|.)?.*?[市区町村])(.*)/
var address = "東京都文京区後楽1丁目3−61" // (東京ドームの住所)
address = address.replace(rex, "$1 / $2 / $3")
console.log(address) // 東京都 / 文京区 / 後楽1丁目3−61
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment