정규식으로 주소를 번지 전후로 분할
개요
자바에서 정규식을 사용하여 주소를 주소 앞뒤로 나누려고합니다.
콘솔에서 주소를 입력하면 분할된 주소가 표시됩니다.
※ 어디까지나 간략한 것이고, 모든 주소를 완벽하게 분할할 수 있는 것이 아니므로 양해 바랍니다.
절차
절차는 다음과 같습니다
1. Pattern 클래스 (java.util.regex.Pattern)로 정규 표현을 컴파일
2.Matcher 클래스(java.util.regex.Matcher)의 find 메소드로 입력된 문자열이 정규식과 일치하는지 확인합니다.
3. 일치하면 문자를 분할하여 표시합니다.
정규 표현의 자세한 것은 이쪽의 사이트를 참고로 했습니다.
htps //w w. 세주쿠. 네 t/bぉg/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행이 분할된 주소입니다.
시험에 사용해보십시오! !
Reference
이 문제에 관하여(정규식으로 주소를 번지 전후로 분할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nururuv/items/cd5fb6323be105edd81e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
절차는 다음과 같습니다
1. Pattern 클래스 (java.util.regex.Pattern)로 정규 표현을 컴파일
2.Matcher 클래스(java.util.regex.Matcher)의 find 메소드로 입력된 문자열이 정규식과 일치하는지 확인합니다.
3. 일치하면 문자를 분할하여 표시합니다.
정규 표현의 자세한 것은 이쪽의 사이트를 참고로 했습니다.
htps //w w. 세주쿠. 네 t/bぉg/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행이 분할된 주소입니다.
시험에 사용해보십시오! !
Reference
이 문제에 관하여(정규식으로 주소를 번지 전후로 분할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nururuv/items/cd5fb6323be105edd81e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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행이 분할된 주소입니다.
시험에 사용해보십시오! !
Reference
이 문제에 관하여(정규식으로 주소를 번지 전후로 분할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nururuv/items/cd5fb6323be105edd81e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)