Java:Match City Regex

时间:2015-08-07 05:41:39

标签: java regex

我正在使用以下正则表达式匹配城市:

[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

3 个答案:

答案 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中使用双反斜杠来逃避正则表达式特殊元字符。

这是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)); 
} 

答案 1 :(得分:1)

好的..我想我经过调整和测试后得到了它。对其他人可能有所帮助。这就是诀窍:

(?<=\n)[a-zA-Z]+(?:[ '-][a-z]+)* ?[A-Z]?[a-z]+

答案 2 :(得分:0)

如果您的所有数据都与问题中的示例相似,那么数据中的模式就是从街道后面的逗号到表示状态的最小2个大写字母。

此模式与所描述的模式匹配,并选择应代表城市的组:

,\s+([a-zA-Z\s]*)[A-Z]{2,}?\s+