我一直在努力解决几个小时内应该非常简单的事情,我很感激任何有用的建议。我有一个带地址的Postgres数据库,我有一个字段,building_name,在很多情况下实际上包含建筑物或公寓号码。这些数字可能会或可能不会以字母为后缀,例如32A,24b等。这些组合可以是字符串中的任何位置,包括开头或结尾。它们后面可能跟有空格或其他非字母数字分隔符,如斜线或短划线。以下是一些例子:
我正在尝试使用正则表达式实现此目的。我能得到的最接近的是'(\d+\w+)'
,它适用于上述某些功能,但不适用于:
' 2/1'或者' 6 CAROLINA COURT'或者' 1/6新组装关闭'
我已遵循此处SQL split string at first occurance of a number的建议,但它不符合我的要求。
任何建议都会非常感激,我完全被卡住了!
非常感谢,
标记
答案 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在这里,因此我避免使用它。