CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第8章 その他の Java 8 機能を理解する : 問題 16 : 正規表現の名前付きキャプチャグループ

問題

市(city)、州(state)、郵便番号(zip code)を含む行を解析するために、名前付きキャプチャグループを用いた正規表現を使用せよ。
郵便番号は、5桁と9桁(5桁ハイフン4桁)の両方を受け付けるようにせよ。

解答

本文には、市(city)と州(state)の2つをピックアップする名前付きキャプチャグループの正規表現を使っていた。

■ 市(city)と州(state)の2つだけの正規表現

(?<city>[\p{L} ]+),\s*(?<state>[A-Z]{2})

つまり、" で囲まない CSV フォーマットを想定しているんですね。

じゃ、郵便番号(zip code)を追加すると、正規表現は次のようになる。

■ 市(city)と州(state)と郵便番号(zip code)の正規表現

(?<city>[\p{L} ]+),\s*(?<state>[A-Z]{2})\s*,\s*(?<zipCode>[0-9]{5}(-[0-9]{4})?)

■ 市、州、郵便番号を含む行の解析

Path path = Paths.get("cities.txt");
Pattern pattern = Pattern.compile(
    "(?<city>[\\p{L} ]+),\\s*(?<state>[A-Z]{2})\\s*,\\s*(?<zipCode>[0-9]{5}(-[0-9]{4})?)"
);
try {
    for (String line : Files.readAllLines(path)) {
        Matcher matcher = pattern.matcher(line);
        if (matcher.matches())
            continue;
        System.out.print("City is "         + matcher.group("city"));
        System.out.print(", State is "      + matcher.group("state"));
        System.out.println(", Zip Code is " + matcher.group("zipCode"));
    }
} catch (IOException ex) {
    ex.printStackTrace();
}