Regex Don';t提取错误的子字符串/数字

Regex Don';t提取错误的子字符串/数字,regex,string,postgresql,substring,Regex,String,Postgresql,Substring,我正在使用PostgreSQL中的地址数据,需要提取4位邮政编码 我有一些地址,比如 'AU克莱顿中心路1503号,邮编31681503' 其中“3168”对应于我的邮政编码 我试过的所有东西都提取了“1503”作为邮政编码,这是错误的。 在其余地址中,非邮政编码的4位数字(如“1503”)在地址中出现两次。在大多数情况下,第二个数字出现在逗号之前(但我不确定是否所有情况都是这样) 以下代码为我提供了一个包含所有4位数字的列表: select array_to_string(regexp_mat

我正在使用PostgreSQL中的地址数据,需要提取4位邮政编码

我有一些地址,比如 'AU克莱顿中心路1503号,邮编31681503' 其中“3168”对应于我的邮政编码

我试过的所有东西都提取了“1503”作为邮政编码,这是错误的。 在其余地址中,非邮政编码的4位数字(如“1503”)在地址中出现两次。在大多数情况下,第二个数字出现在逗号之前(但我不确定是否所有情况都是这样)

以下代码为我提供了一个包含所有4位数字的列表:

select array_to_string(regexp_matches('1503 CENTRE RD CLAYTON VIC 3168 1503, AU', '\m[0-9]{4}\M', 'g'), '')
但当我更新“邮政编码”列时,只使用第一行

我需要一个代码,首先检查是否有一个以上的4位数字。如果是这种情况,我需要实现以下规则(我不知道如何实现): “如果字符串中有多个4位数字,则只提取唯一的数字(3168);去掉出现两次的数字”

你就快到了

with t(id,x) as (values
  (1,'1503 CENTRE RD CLAYTON VIC 3168 1503, AU'::text),
  (2,'1111 2222 3333 1111')) 
select id, n[1]
from t, regexp_matches(x, '\m\d{4}\M', 'g') as n 
group by id, n[1]
having count(*) = 1; -- Check for uniqueness