为什么这个Java正则表达式在剥离美国街道地址中的街道号码时工作不一致?

3

我想从邮寄地址中去掉街道号码。

我有一个Java正则表达式:

address.replace("^\\s*[0-9]+\\s+","");

它在此地址上运行:

301 West 23rd Street

使其变得更好:
West 23rd Street

但是当我将其应用于此地址时,该地址未发生变化:
70-50 69th Place

相反,它需要是这样的:
69th Place

有什么想法吗?
4个回答

4

您的正则表达式与该字符串不匹配。以下是正则表达式的解释:

^      匹配字符串的开头。
\\s*   零个或多个空格。匹配空字符串。
[0-9]+ 一个或多个数字。匹配"70"。
[-]?   可选的连字符。匹配一个连字符或空字符串。
\\s+   一个或多个空格。不匹配。

"70"后面的字符是一个连字符,而连字符不是空格字符,因此匹配失败,没有进行替换。要修复它,您可以将连字符放在字符类中:

address = address.replace("^\\s*[0-9-]+\\s+", "");

当连字符出现在字符类中时,它具有特殊含义(一组字符),但有两种情况除外:

  • 当它位于字符类的开头或结尾时
  • 当它用反斜杠进行转义时(但请注意,在Java字符串文字中需要两个反斜杠)。

1
该正则表达式仅会剥离出第一组遇到的数字。它还有困难处理“-”符号。如果你想剥离每一组数字,包括“-”,可以使用如下方法:
address.replace("^\\s*([0-9-]+\\s+)+","");

1

你的正则表达式指定查找:空格、数字、空格,然后将它们替换为空。

你的“坏”字符串中没有空格、数字、空格,而是有空格、数字、破折号。

如果你想在街道号码中包含破折号,请尝试这个:"^\\s*[0-9-]+\\s+"


0

如果我可以提一个建议...仅使用正则表达式来操作地址数据,就像使用单个大锤从山上雕刻总统山一样。虽然可能一开始看起来很有效,但还有很多工作要做。

您考虑过以各种形式输入的地址以及与预期不同顺序的组件吗?关于没有“th”或“st”的街道名称等等(这里列举了太多情况)。

我在SmartyStreets工作,我们的专业是标准化和验证地址。对于您的任务,您可以连接到一种CASS认证的API来返回地址,标准化并分解为组件(拆成几个部分),以便您只保留所需的部分并且是准确的。我建议您尝试类似于LiveAddress这样的东西,它可以免费提供这种服务。自己研究一些内容,我很乐意回答您其他地址相关的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接