我正在尝试编写一个java代码,允许根据城市名称或邮政编码显示城市列表:
我写了许多表达,但他们没有100%的工作。 这是我的最后一句话:
([A-Z_]+)(:)([0-9]+)
表达式应与城市名称匹配:可以是:Lonéy' ed
或其代码邮件57000
有没有人知道如何改善我的表达?
感谢名单。
答案 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));
}