我使用以下正则表达式来匹配城市:
[a-zA-Z]+(?:[ '-][a-zA-Z]+)*
问题是它不仅与城市匹配,而且还与街道名称的一部分匹配。
如何使其仅匹配城市(例如布鲁克林和哥伦比亚市)?
更新:
数据以 1 行文本表示(每个地址将分别输入正则表达式引擎):
2778 Ray Ridge Pkwy,
Brooklyn NY 1194-5954
1776 99th St,
Brooklyn NY 11994-1264
1776 99th St,
Columbia City OR 11994-1264
最佳答案
我建议采用以下方法:从字符串开头开始匹配单词,直到第一次出现 2 个大写字母,后跟 ZIP(请参阅前瞻 (?=\s+[A-Z]{2}\s+\d{5}-\d{4})
如下):
^[A-Za-z]+(?:[\s'-]+[A-Za-z]+)*(?=\s+[A-Z]{2}\s+\d+-\d+)
参见demo
正则表达式:
^
- 然后从头开始查找[A-Za-z]+
- 匹配单词(?:[\s'-]+[A-Za-z]+)*
- 匹配 0 个或多个单词...(?=\s+[A-Z]{2}\s+\d+-\d+)
- 位于空格 + 2 个大写字母、空格、1 个或多个数字、连字符和 1 之前或更多数字。
如果 ZIP(或数字代表的任何内容)是可选的,您可以只依赖 2 个大写字母:
^[A-Za-z]+(?:[\s'-]+[A-Za-z]+)*(?=\s+[A-Z]{2}\b)
请注意,\s+[A-Z]{2}\b
中的 \b
是一个单词边界,它将强制使用非单词(空格或标点符号,甚至结尾)字符串)出现在 2 个大写字母之后。
只是不要忘记在 Java 中使用双反斜杠来转义正则表达式特殊元字符。
这是一个Java code demo :
String s = "Brooklyn NY 1194-5954";
Pattern pattern = Pattern.compile("^[A-Za-z]+(?:[\\s'-]+[A-Za-z]+)*(?=\\s+[A-Z]{2}\\b)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(0));
}
关于Java:匹配城市正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870493/