使用正则表达式 Java 邮政编码后的 space 拆分地址

Splitting addresses using the space after the postal code with regex Java

有些原始行有两个或更多地址,我想使用 look-arround 机制根据加拿大邮政编码的最后部分拆分它们。 加拿大邮政编码格式为A1A 1A1,其中A为字母,1为数字,第三个和第四个字符之间用space分隔。

这是一个例子

160 Rue, Notre Dame N, Bureau 140, Sainte-Marie, G6E 3Z9 887 Chemin du Bord de l'Eau, Saint-Henri de Levis, G0R 3E0

我想根据邮政编码最后一部分space拆分地址(如果存在) 结果:

160 Rue, Notre Dame N, Bureau 140, Sainte-Marie, G6E 3Z9
887 Chemin du Bord de l'Eau, Saint-Henri de Levis, G0R 3E0

我试过了

List<String>  addresses = new ArrayList<String>();
addresses =  Arrays.asList(long_addresses.Address.split("(\d\w\d)\s"));

但结果是:

[, Rue, Notre Dame N, Bureau 140, Sainte-Marie, G6E , , Chemin du Bord de l'Eau, Saint-Henri de Levis, G0R 3E0]

这里有一些其他的例子

141 rang du brûlé, pont rouge, G3H1B8 200 rue Commerciale, Donnacona, G3M 1W1

33 rue provost, Montreal, H8S 1L3 46 avenue Sainte-Anne, Pointe-Claire, H9S 4P8 2035 rue Victoria, Lachine, H8S 0A8 2075 rue de l'Eglise, Saint-Laurent, H4M 1G3 800 Pl Leigh-Capreol, Dorval, Montréal, H4Y 0A4

2075 rue de l'Eglise, Saint-Laurent, H4M 1G3 2035 rue Victoria, Lachine, H8S 0A8 46 ave, Sainte-Anne, Pointe-Claire, H9S 4P8 12 Charlevoix , Kirkland, H9J 2T6 930 St Germain St, Ville St-Laurent, H4L 3R9 1417 argyle , Montreal, H3G 1V5

注:我trim最后一个没有space的邮政编码。 提前谢谢你。

您可以使用

(?<=\b[a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)\s+

或者,如果 A1A1A1 之间的 space 是可选的,并且可以丢失,则可以使用

(?<=\b[a-zA-Z]\d[a-zA-Z]\s{0,1}\d[a-zA-Z]\d)\s+

这仍然有效,因为 Java 正则表达式引擎支持约束宽度的后视模式。

regex demo / regex demo #2详情:

  • (?<=\b[a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d) - 正向后视需要(紧靠当前位置的左侧):
    • \b - 单词边界
    • [a-zA-Z] - 一封信
    • \d - 一个数字
    • [a-zA-Z]\s\d[a-zA-Z]\d - 一个字母,一个白色space,数字,字母和一个数字
  • \s+ - 一个或多个白色spaces.

\s{0,1}匹配一个或零个白spaces.

参见 Java demo online:

String s = "160 Rue, Notre Dame N, Bureau 140, Sainte-Marie, G6E 3Z9 887 Chemin du Bord de l'Eau, Saint-Henri de Levis, G0R 3E0";
String regex = "(?<=\b[a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)\s+";
// Or
// String regex = "(?<=\b[a-zA-Z]\d[a-zA-Z]\s{0,1}\d[a-zA-Z]\d)\s+";
String results[] = s.split(regex);
for (String str: results) {
    System.out.println(str);
}

输出:

160 Rue, Notre Dame N, Bureau 140, Sainte-Marie, G6E 3Z9
887 Chemin du Bord de l'Eau, Saint-Henri de Levis, G0R 3E0