使用正则表达式从字符串中解析建筑物编号

时间:2015-01-29 16:19:09

标签: regex postgresql

我一直在努力解决几个小时内应该非常简单的事情,我很感激任何有用的建议。我有一个带地址的Postgres数据库,我有一个字段,building_name,在很多情况下实际上包含建筑物或公寓号码。这些数字可能会或可能不会以字母为后缀,例如32A,24b等。这些组合可以是字符串中的任何位置,包括开头或结尾。它们后面可能跟有空格或其他非字母数字分隔符,如斜线或短划线。以下是一些例子:

  • ' 11B'应该返回' 11B'
  • ' BURNFOOT COTTAGE'由于没有数字,所以不应该返回
  • ' 2/1'应该返回' 2'
  • ' 15A'应该返回' 15a'
  • ' 6 CAROLINA COURT'应该返回' 6'
  • ' PATRICK THOMAS COURT 83B'应该返回' 83B'
  • ' UNIT 51'应该返回' 51'
  • ' 1/6 NEW ASSEMBLY CLOSE'应该返回' 1'
  • ' 15E GREENVALE'应该返回' 15E'

我正在尝试使用正则表达式实现此目的。我能得到的最接近的是'(\d+\w+)',它适用于上述某些功能,但不适用于:

' 2/1'或者' 6 CAROLINA COURT'或者' 1/6新组装关闭'

我已遵循此处SQL split string at first occurance of a number的建议,但它不符合我的要求。

任何建议都会非常感激,我完全被卡住了!

非常感谢,

标记

3 个答案:

答案 0 :(得分:1)

您的正则表达式不起作用,因为您使用+限定符,该限定符搜索一个或多个字母。如果您要查找 one或none ,请使用?限定符:'\d+\w?'

答案 1 :(得分:0)

如Nick B所述,最好指定您正在使用的RegEx实现。 作为一般答案,您可以尝试这样的事情:

(^|\s)(\d+[a-Z]?\b)

从结果中取出第二组。

(^|\s)匹配行开头或空格。这允许从输出中排除1测试用例中的数字2/1

然后\d+[a-Z]?应匹配至少一个数字后跟最多一个字母的任何序列。

希望这有帮助!

答案 2 :(得分:0)

当这是可选的时候,你强迫一个单词字符(并且不适用于非字母数字非数字)。

因此,假设您正在使用POSIX regexes in PostGres,请尝试以下方法:

(\d+\w*)[ /\\\-]|$

确保将第1组捕获为输出。

这涉及一些猜测,没有很多PG风格的在线测试人员。

请注意,PostGres似乎不支持Perl风格的正则表达式,所以你的\b won't ever work在这里,因此我避免使用它。