第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(); }