我正在使用以下正则表达式匹配城市:
[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
答案 0 :(得分:2)
我建议采用以下方法:匹配字符串开头的单词,直到第一次出现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)
请注意\b
中的\s+[A-Z]{2}\b
是一个单词边界,它会强制在2个大写字母后出现非单词(空格或标点符号或字符串结尾)。
不要忘记在Java中使用双反斜杠来逃避正则表达式特殊元字符。
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));
}
答案 1 :(得分:1)
好的..我想我经过调整和测试后得到了它。对其他人可能有所帮助。这就是诀窍:
(?<=\n)[a-zA-Z]+(?:[ '-][a-z]+)* ?[A-Z]?[a-z]+
答案 2 :(得分:0)
如果您的所有数据都与问题中的示例相似,那么数据中的模式就是从街道后面的逗号到表示状态的最小2个大写字母。
此模式与所描述的模式匹配,并选择应代表城市的组:
,\s+([a-zA-Z\s]*)[A-Z]{2,}?\s+