背景
ネット上に乗せられてある日本の住所のフォーマットが普段は決まっています。郵便番号から都道府県市区町までの流れて表示しているはず。そして正規表現の郵便番号とか県名とかを抽出することによって、Google Geocodingするなど仕様はよくあります。
正規表現
ここで気をつけないといけないのは県名とか市名とかを抽出するためには貪欲モードを使うわけにはいかないです。
(.*県)ではなくて(.*?県)です
そうしないと、例えば"愛知県名古屋市県民分館"を解析の結果は"愛知県"ではなく、"愛知県名古屋市県"まで取り出してしまいます。
ソースコード
String matchString = "〒066-0012\n" +
"北海道千歳市美々 新千歳空港国内線ターミナルビル2F";
Matcher matcher = Pattern.compile("\\s*〒(\\d{3}-\\d{4})[\\s ]*(.*?都)?(.*?道)?(.*?府)?(.*?県)?(.*?市)?(.*?区)?").matcher(matchString);
while (matcher.find()){
System.out.println("住所:" + matcher.group(0));
System.out.println();
System.out.println("郵便番号:" + matcher.group(1));
System.out.println();
System.out.println("都名:" + matcher.group(2));
System.out.println();
System.out.println("道名:" + matcher.group(3));
System.out.println();
System.out.println("府名:" + matcher.group(4));
System.out.println();
System.out.println("県名:" + matcher.group(5));
System.out.println();
System.out.println("市名:" + matcher.group(6));
System.out.println();
System.out.println("区名" + matcher.group(7));
}
結果
住所:〒066-0012
北海道千歳市
郵便番号:066-0012
都名:null
道名:北海道
府名:null
県名:null
市名:千歳市
区名null
簡単な内容ですが、よく使われると思って、投稿しました。