鉴于您对我的其他答案的回复,这应该适用于您指定的严格格式的案例:
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)
将为空),如果街道号码是“45A”或“45-47”,如果我们在道路上添加一个空间(“Jindabyne East Rd”)或到郊区('Oakleigh South')。
如果您不熟悉正则表达式,只是为了进一步解释该正则表达式:
(([^/ ]+)/)?
相当于 just ([^/ ]+/)?
-- 即“不包括正斜杠或空格的任何内容,后跟一个斜杠”。问号使其可选(因此整个子句可能会丢失),最终版本中的额外括号用于创建一个较小的内部组,不带斜线,以供以后提取。
([^ ]+)
是“捕获任何不是空格的东西(后面跟一个空格)”——这是门牌号。
([^,]+),
是“捕获任何不是逗号的东西(后面是逗号和空格)”——这是街道名称。只要不是逗号,街道名称中的任何内容都是有效的。
([^,]+),
再次是相同的,在这种情况下捕获郊区。
([^ ]+)
捕获下一个非空格字符串(状态缩写)并跳过其后的空格。
(\\d+)
通过捕获任意数量的数字(邮政编码)四舍五入
希望这会有所帮助。