如何正则表示一个字符串代表一个城市或带有重音的邮政编码?

时间:2016-08-04 21:56:28

标签: java regex

我正在尝试编写一个java代码,允许根据城市名称或邮政编码显示城市列表:

我写了许多表达,但他们没有100%的工作。 这是我的最后一句话:

([A-Z_]+)(:)([0-9]+)

表达式应与城市名称匹配:可以是:Lonéy' ed或其代码邮件57000

有没有人知道如何改善我的表达?

感谢名单。

2 个答案:

答案 0 :(得分:2)

从Java7开始,您可以执行以下操作:

Pattern.compile("([\\p{Alpha} '-_]+):(\\d{5})", Pattern.UNICODE_CHARACTER_CLASS)

继续添加连接字符(此处为['-_])以满足您的所有需求。

该模式不会对某个地方名称的情况作出任何假设,因为在某些非拉丁文字体中没有任何情况。

编辑:添加了5位数的邮政编码检测和一个用于名称检测的SPACE

答案 1 :(得分:2)

我建议使用

"(?U)(\\p{Lu}[\\p{L}\\p{M}\\s'-]*):(\\d{5})\\b"

这意味着:

  • (?U) - 一个Pattern.UNICODE_CHARACTER_CLASS内联标志,使\b字符串为bou和\d数字字符类Unicode识别模式
  • (\\p{Lu}[\\p{L}\\p{M}\\s'_-]*) - 第1组捕获:
    • \\p{Lu} - 一个大写的Unicode字母
    • [\\p{L}\\p{M}\\s'_-]* - 0个或多个Unicode字母(\\p{L}),变音符号(\\p{M}),空格(\\s),'_-(注意连字符必须位于字符类的末尾,以便可以将其视为字面连字符)
  • : - 字面冒号
  • (\\d{5}) - (第2组)五位数
  • \\b - 一个单词边界,这样我们只匹配5个数字,后跟单词char(不是110位子字符串中的5个数字),可以替换为"(?!\\d)"

请参阅Java demo

String s = "Lonéy' ed:57000";
Pattern pattern = Pattern.compile("(?U)(\\p{Lu}[\\p{L}\\p{M}\\s'-]*):(\\d{5})\\b");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
}