私の他の回答への返信を考えると、これは、指定した厳密にフォーマットされたケースに対して行う必要があります。
String sample = "3A/45 Jindabyne Rd, Oakleigh, VIC 3166";
Pattern pattern = Pattern.compile("(([^/ ]+)/)?([^ ]+) ([^,]+), ([^,]+), ([^ ]+) (\\d+)");
Matcher m = pattern.matcher(sample);
if (m.find()) {
System.out.println("Unit: " + m.group(2));
System.out.println("Number: " + m.group(3));
System.out.println("Street: " + m.group(4));
System.out.println("Suburb: " + m.group(5));
System.out.println("State: " + m.group(6));
System.out.println("Postcode: " + m.group(7));
} else {
throw new IllegalArgumentException("WTF");
}
これは、'3A/' を削除した場合 (この場合m.group(2)
は null になります)、番地が '45A' または '45-47' の場合、道路にスペースを追加した場合 ('Jindabyne East Rd')、または郊外へ(「オークリー・サウス」)。
正規表現に慣れていない場合は、その正規表現をさらに説明するために:
(([^/ ]+)/)?
は just と同等です([^/ ]+/)?
-- つまり、「スラッシュまたはスペースを含まず、その後にスラッシュが続くもの」です。疑問符はそれをオプションにし (節全体が欠落している可能性があります)、最終バージョンの余分な括弧は、後で抽出するために、スラッシュなしで小さな内部グループを作成するためのものです。
([^ ]+)
は「スペースではないものをキャプチャする (スペースが続く)」です。これは通りの番号です。
([^,]+),
は「カンマ以外のすべてをキャプチャ (カンマとスペースが続く)」です。これは通りの名前です。通りの名前はコンマでなければ何でも有効です。
([^,]+),
再び同じです。この場合は郊外をキャプチャします。
([^ ]+)
次の非スペース文字列 (州の省略形) をキャプチャし、その後のスペースをスキップします。
(\\d+)
任意の桁数 (郵便番号) を取得して丸めます
お役に立てば幸いです。