住所入力フォームで入れておきたいのが、正規表現による郵便番号のエラーチェックだ。
Javaでの正規表現による郵便番号の扱い方についてこのページではまとめている。参考にして欲しい。
正規表現による郵便番号の扱い方
Javaの正規表現を使うと、郵便番号のチェックをしたりテキストの中から郵便番号を抽出したりすることができる。
最初に、対象となる郵便番号はどのような形式があるのかを確認しておこう。郵便番号の基本的な形式は、一般的に数字3桁に続く数字4桁をハイフン「-」で繋げたものだ。これに加えて、郵便番号が先頭に付いているものや、ハイフンがない数字だけのものもある。
- 333-5555
- 〒 333-5555
- 3335555
正規表現
では、これらの郵便番号の正規表現はどうなるか見てみよう。郵便番号と対応する正規表現は以下のようになる。
|
郵便番号の種類 |
郵便番号 |
正規表現 |
|
基本 |
333-5555 |
^[0-9]{3}-[0-9]{4}$ |
|
郵便マーク付き |
〒 333-5555 |
^〒\s[0-9]{3}-[0-9]{4}$ |
|
ハイフン無し |
3335555 |
^[0-9]{7}$ |
各プログラミング言語における正規表現表記
この比較表は、Java以外のプログラミング言語で基本郵便番号の正規表現を扱うとどうなるかを示している。
ほとんど変わらない感覚だ。
|
郵便番号 |
言語 |
正規表現 |
|
333-5555 |
Java |
[0-9]{3}-[0-9]{4} |
|
Ruby |
Javaと同じ |
|
|
PHP |
/[0-9]{3}-[0-9]{4}/ |
|
|
C/C++ |
Javaと同じ |
郵便番号をチェックするサンプルプログラム
それでは実際にサンプルプログラムを確認してみよう。このサンプルプログラムでは、郵便番号が形式に合致しているかどうか正規表現を使ってチェックしている。郵便番号「333-5555」については、番号が正しい場合だけでなく、誤った場合に不正な番号として検出されることも確認している。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CheckZipCode {
public static void main(String args[]) {
checkRightZipCodes();//[1]
checkWrongZipCodes();//[2]
}
private static void checkRightZipCodes() {//[3]
System.out.println("[4] 正しい郵便番号");
checkZipCodeByRegularExpression("333-5555");//[5]
checkZipCodeByRegularExpression("〒 333-5555");//[6];
checkZipCodeByRegularExpression("3335555");//[7]
}
private static void checkWrongZipCodes() {//[8]
System.out.println("[9] 誤った郵便番号");
checkZipCodeByRegularExpression("33-5555");//[10]
checkZipCodeByRegularExpression("333-555");//[11]
checkZipCodeByRegularExpression("3333-5555");//[12]
checkZipCodeByRegularExpression("333-55555");//[13]
checkZipCodeByRegularExpression("3A3-5555");//[14]
checkZipCodeByRegularExpression("333-5X55");//[15]
}
private static void checkZipCodeByRegularExpression(String code) {//[20]
boolean result;//[21]
result = checkZipCode(code, "^[0-9]{3}-[0-9]{4}$", "基本の");//[22]
if (result) return;;//[23]
result = checkZipCode(code, "^〒\\s[0-9]{3}-[0-9]{4}$", "マーク付き");//[24]
if (result) return;;//[25]
result = checkZipCode(code, "^[0-9]{7}$", "ハイフンのない");//[26]
if (result) return;;//[27]
System.out.println("[28] 不正な郵便番号:" + code);
}
private static boolean checkZipCode(String code, String regularExpression, String type) {//[40]
Pattern pattern = Pattern.compile(regularExpression);//[41]
Matcher matcher = pattern.matcher(code);//[42]
if (matcher.find()) {//[43]
System.out.println("[44] " + type + "郵便番号:" + matcher.group());
return true;//[45]
}
return false;//[46]
}
}
実行結果
[4] 正しい郵便番号 [44] 基本の郵便番号:333-5555 [44] マーク付き郵便番号:〒 333-5555 [44] ハイフンのない郵便番号:3335555 [9] 誤った郵便番号 [28] 不正な郵便番号:33-5555 [28] 不正な郵便番号:333-555 [28] 不正な郵便番号:3333-5555 [28] 不正な郵便番号:333-55555 [28] 不正な郵便番号:3A3-5555 [28] 不正な郵便番号:333-5X55
サンプルプログラムの説明
このサンプルプログラムでは、正しい形式の郵便番号と誤った形式の郵便番号をチェックして、正規表現によって正しくチェックが行われるかをテストしている。
テストに使用した正しい形式の郵便番号は次の通りである。
|
郵便番号 |
郵便番号の種類 |
|
333-5555 |
基本 |
|
〒 333-5555 |
郵便マーク付き |
|
3335555 |
ハイフン無し |
テストに使用した誤った形式の郵便番号は次の通りである。
|
郵便番号 |
不正な箇所 |
|
33-5555 |
最初の3桁の桁数が不足 |
|
333-555 |
最後の4桁の桁数が不足 |
|
3333-5555 |
最初の3桁の桁数が超過 |
|
333-55555 |
最後の4桁の桁数が超過 |
|
3X3-5555 |
最初の3桁に数値以外の文字の混入 |
|
333-5X55 |
最後の4桁に数値以外の文字の混入 |
正しい形式ならば、郵便番号の種類に加えて形式にマッチした郵便番号を表示する。また、どの形式にもマッチしなかったならば、「不正な郵便番号」として元の文字列をそのまま表示している。
まとめ
このページでは主にJavaでの郵便番号の正規表現についてお伝えした。作りがシンプルなだけに書き方も簡単だ。
正規表現の練習にちょうどいいと思うので、一度書いて見てからチェックするのもいいだろう。



