Java:匹配城市正则表达式

标签 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

最佳答案

我建议采用以下方法:从字符串开头开始匹配单词,直到第一次出现 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/

相关文章:

java - 使用 SwingWorker 在 GUI 中添加进度条

java - JPA:Eclipselink 不会在数据库中保留双向关系

javascript - 如何使用带有文本输入的 Javascript 检查数组中的值

php - 从字符串中删除换行符后的双空格和空格

node.js - 如何在node.js中获得对regexp-match-indices的支持?

Php Regex 排除已经匹配的特定模式

java - 关于Java中ArrayDeque的实现

java - Android - 尝试从 Activity 2 到 Activity 1 以及从方法到方法获取数据

java - GXT3 从选项卡面板/选项卡容器中删除选项卡

python - 正则表达式将 string1 与 string2 的最长可能子字符串匹配