首页 > 解决方案 > 使用正则表达式将城市名称和可选的国家代码 (ISO-3166) 分成组

问题描述

作为输入,我有一个城市名称列表:

Frankfurt an der Oder
Hamburg
Baden-Baden
Wickede (Ruhr)
Jokne’am

我假设空格和特殊字符的任何组合都是可能的。其中一些将在括号中添加 ISO-3166-2 或 ISO-3166-3 国家代码:

Frankfurt an der Oder
Saint-Sulpice (FR)
Hamburg
Erlenbach-Zürich (CH)
Baden-Baden
Ra’s al-Chaima (ARE)
Wickede (Ruhr)
Jokne’am
Hobbiton (W-Farthing) (ME)

同样,我假设城市名称可以任意组合空格和特殊字符。我所知道的是,如果有一个国家代码,它将始终位于字符串的末尾,它始终是 2 或 3 个大写字母 [AZ]。所以(ARE)是国家代码,(UK)是,(Ruhr)不是,(Abc)也不是。

我想出的是:

^(.*)(?:\()([A-Z]{2,3})(?:\))$

一组捕获 cityname 的所有可能字符(.*),然后是包含左括号字符的非捕获组(?:\(),一组捕获 2 或 3 个大写单词字符([A-Z]{2,3}),最后一组非捕获组获取右括号字符(?:\))

这对于具有国家/地区代码后缀的城市名称非常有效。group(1)将具有group(2)不带括号的城市名称和国家代码。

但是对于没有国家/地区代码的城市名称,我需要的是group(1)= cityname 和group(2)= null。我试图通过将第二部分全部放在一个大组中并对其进行选择来使第二部分成为可选,但这不起作用:

(.*)((?:\()([A-Z]{2,3})(?:\)))?

标签: javaregexregex-group

解决方案


推荐阅读