为什么这个Java正则表达式不能用于从美国街道地址中删除街道号码?

时间:2010-09-13 19:44:39

标签: java regex

我正试图从邮寄地址中删除街道号码。

我在Java中有一个正则表达式:

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

它适用于此地址:

301 West 23rd Street

制作:

West 23rd Street

但是当我将它应用于此地址时,地址不变:

70-50 69th Place

相反,它必须是:

69th Place

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

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

^      Start of string. Matches successfully.
\\s*   Zero or more whitespace. Matches the empty string.
[0-9]+ One or more digits. Matches "70".
\\s+   One or more whitespace. Fails to match.

“70”后面的字符是连字符,连字符不是空格字符,因此匹配失败并且不进行替换。要修复它,你可以在字符类中加一个连字符:

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

当连字符在字符类中时,它具有特殊含义(一系列字符),除了两种情况:

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

答案 1 :(得分:1)

正则表达式只会删除它遇到的第一组数字。它也遇到了麻烦 - 。如果要删除每组数字,包括-s,请执行以下操作:

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

答案 2 :(得分:1)

你的正则表达式说找到:空格,数字,空格,然后用什么都替换它们。

你的“坏”字符串没有空格,数字,空格,它有空格,数字,短划线。

如果您想在街道号码中加入短划线,请尝试以下操作:"^\\s*[0-9-]+\\s+"

答案 3 :(得分:0)

如果我可以提出建议......只需使用正则表达式来操作地址数据,就像使用一个手提钻来雕刻山。拉什莫尔出了山。它似乎最初起作用,但仍有很多工作要做。

您是否考虑过以所有形式输入的地址以及与预期不同的订单中的组件?怎么样的街道名称没有“th”或“st”的数字等等(这里列出的案例太多了。)

我为SmartyStreets工作,我们的专长是标准化和验证地址。对于您的任务,您可以连接到CASS认证的各种API以返回地址,标准化和组件化(分成几部分),这样您就可以保留您想要的部分,并且准确。我建议你研究像LiveAddress这样的东西,免费提供。自己做一些研究,我很乐意帮助回答你遇到的其他与地址有关的问题。