<java>正規表現で住所を番地前後で分割する
概要
javaで正規表現を使って、住所を番地前後で分割しようと思います。
コンソールから住所を入力することで分割された住所が表示されます。
※あくまで簡略的なものであり、全ての住所を完璧に分割できるものではないのでご了承ください。
手順
手順は以下の通りです
1.Patternクラス(java.util.regex.Pattern)で正規表現をコンパイル
2.Matcherクラス(java.util.regex.Matcher)のfindメソッドで入力された文字列が正規表現にマッチするか確認する。
3.マッチした場合文字を分割し、表示する。
正規表現の詳細はこちらのサイトを参考にいたしました。
https://www.sejuku.net/blog/13215
コード
SplitAddress.java
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SplitAddress{
public static void main(String args[]) throws Exception {
System.out.println("住所を入力してください");
Scanner sc = new Scanner(System.in);
//コンソールに入力された文字を下記メソッドに引数として渡します。
String[] ad = split(sc.nextLine());
//出力しておく
System.out.println(ad[0]+"\n"+ad[1]+"\n"+ad[2]);
sc.close();
}
//住所を分割するメソッド
static String[] split(String str)throws Exception {
String[] ad = new String[3];
//判定するパターンの生成準備
//半角数字・全角数字が一回以上または漢数字が一回以上(番地の先頭)
String p1 = "([0-90-9]+|[一二三四五六七八九十百千万]+)+";
//半角数字・全角数字が一回以上または漢数字が一回以上またはハイフンなどの接続記号が0回以上(番地の中身)
String p2 = "([0-90-9]+|[一二三四五六七八九十百千万]+|(丁目|丁|番地|番|号|-|‐|ー|−|の))*";
//半角数字・全角数字が一回以上または漢数字が一回以上または数字/号など番地の終わりに使われる文字が1回(番地の終わり)
String p3 = "([0-90-9]+|[一二三四五六七八九十百千万]+|(丁目|丁|番地|番|号))";
//ex)番地が2-6-6なら「2」がp1、「-6-」がp2、「6」がp3に当てはまります。
//正規表現
Pattern p = Pattern.compile(p1+p2+p3);
Matcher m = p.matcher(str);
//正規表現に該当する文字列があればその前後で住所を分割する
if(m.find()) {
ad[0] = str.substring(0,m.start());
ad[1] = str.substring(m.start(),m.end());
ad[2] = str.substring(m.end(),str.length());
//四万十3-6-1みたいな漢数字+数字の時のための処理
//(3分割された住所の番地部分に、漢数字1回+数字1回という正規表現に該当する文字列があれば分割する境を訂正する)
//漢数字1回+数字1回
String p4 = "[一二三四五六七八九十百千万][0-90-9]";
p = Pattern.compile(p4);
m = p.matcher(ad[1]);
if(m.find()) {
String tmp = ad[1].substring(0,m.start());
ad[0] = ad[0] + tmp;
ad[1] = ad[1].substring(m.start(),ad[1].length());
}
//3-4-5三井ビルみたいな数字+漢数字の時のための処理
String p5 = "[0-90-9][一二三四五六七八九十百千万]";
p = Pattern.compile(p5);
m = p.matcher(ad[1]);
if(m.find()) {
String tmp = ad[1].substring(m.start()+1,ad[1].length());
ad[2] = tmp + ad[2];
ad[1] = ad[1].substring(0,m.start());
}
}else ad[0] = str;
return ad;
}
}
実行結果
緑色の文字が入力した住所、その下3行が分割された住所です。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SplitAddress{
public static void main(String args[]) throws Exception {
System.out.println("住所を入力してください");
Scanner sc = new Scanner(System.in);
//コンソールに入力された文字を下記メソッドに引数として渡します。
String[] ad = split(sc.nextLine());
//出力しておく
System.out.println(ad[0]+"\n"+ad[1]+"\n"+ad[2]);
sc.close();
}
//住所を分割するメソッド
static String[] split(String str)throws Exception {
String[] ad = new String[3];
//判定するパターンの生成準備
//半角数字・全角数字が一回以上または漢数字が一回以上(番地の先頭)
String p1 = "([0-90-9]+|[一二三四五六七八九十百千万]+)+";
//半角数字・全角数字が一回以上または漢数字が一回以上またはハイフンなどの接続記号が0回以上(番地の中身)
String p2 = "([0-90-9]+|[一二三四五六七八九十百千万]+|(丁目|丁|番地|番|号|-|‐|ー|−|の))*";
//半角数字・全角数字が一回以上または漢数字が一回以上または数字/号など番地の終わりに使われる文字が1回(番地の終わり)
String p3 = "([0-90-9]+|[一二三四五六七八九十百千万]+|(丁目|丁|番地|番|号))";
//ex)番地が2-6-6なら「2」がp1、「-6-」がp2、「6」がp3に当てはまります。
//正規表現
Pattern p = Pattern.compile(p1+p2+p3);
Matcher m = p.matcher(str);
//正規表現に該当する文字列があればその前後で住所を分割する
if(m.find()) {
ad[0] = str.substring(0,m.start());
ad[1] = str.substring(m.start(),m.end());
ad[2] = str.substring(m.end(),str.length());
//四万十3-6-1みたいな漢数字+数字の時のための処理
//(3分割された住所の番地部分に、漢数字1回+数字1回という正規表現に該当する文字列があれば分割する境を訂正する)
//漢数字1回+数字1回
String p4 = "[一二三四五六七八九十百千万][0-90-9]";
p = Pattern.compile(p4);
m = p.matcher(ad[1]);
if(m.find()) {
String tmp = ad[1].substring(0,m.start());
ad[0] = ad[0] + tmp;
ad[1] = ad[1].substring(m.start(),ad[1].length());
}
//3-4-5三井ビルみたいな数字+漢数字の時のための処理
String p5 = "[0-90-9][一二三四五六七八九十百千万]";
p = Pattern.compile(p5);
m = p.matcher(ad[1]);
if(m.find()) {
String tmp = ad[1].substring(m.start()+1,ad[1].length());
ad[2] = tmp + ad[2];
ad[1] = ad[1].substring(0,m.start());
}
}else ad[0] = str;
return ad;
}
}
緑色の文字が入力した住所、その下3行が分割された住所です。
試しに使ってみてください!!
Author And Source
この問題について(<java>正規表現で住所を番地前後で分割する), 我々は、より多くの情報をここで見つけました https://qiita.com/nururuv/items/cd5fb6323be105edd81e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .