使用正则表达式 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+
或者,如果 A1A
和 1A1
之间的 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
有些原始行有两个或更多地址,我想使用 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+
或者,如果 A1A
和 1A1
之间的 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