正则表达式 Oracle 删除美国和加拿大格式的邮政编码后的所有内容

Regexp Oracle remove everything after zip code of US and Canada format

我的地址格式类似于

123, abc street, Dallas, Tx 75701, 500-998-7898, Directions X Y Z west of

我想删除 ZIP CODE 之后与美国格式(5 位格式或 5 位 + 4 位代码格式)以及加拿大邮政编码格式(如 Y89 567 或 Y89567)匹配的所有内容。

所以我的最终答案应该是这样的。

123, abc street, Dallas, Tx 75701

感谢任何帮助。

这是一种方法。请注意任何 "looks like" 和 U.S。或加拿大邮政编码将被假定为一个。此外,您会错过 Beverly Hills, Calif. 90210 之类的内容,因为 "Calif." 不是 "seen" 作为州代码。我也有点粗心;如果邮政编码后面有任何内容,则不应是字母或数字。我没有为此写 "test";如果需要,留作练习。

我假设如果没有找到邮政编码,则必须返回整个输入字符串。

with
  inputs ( addr ) as (
    select '123, abc street, Dallas, Tx 75701, 500-998-7898'        from dual union all
    select '336 Main St, New City, NZ 39023-8882, john.d@email'     from dual union all
    select '837B Hilltop, Canadian City, ON Z34802 4028048 kilo'    from dual union all
    select '12345 Circle Drive, Lakeview, MN'                       from dual
  )
select addr,
       regexp_substr( addr, 
                      '(.*?([[:alpha:]]{2} \d{5}(-\d{4})?|[[:alpha:]]\d{2} ?\d{3}|$))',
                      1, 1, null, 1) as clean_addr
from   inputs
;

ADDR                                                CLEAN_ADDR                        
--------------------------------------------------- --------------------------------------
123, abc street, Dallas, Tx 75701, 500-998-7898     123, abc street, Dallas, Tx 75701
336 Main St, New City, NZ 39023-8882, john.d@email  336 Main St, New City, NZ 39023-8882
837B Hilltop, Canadian City, ON Z34802 4028048 kilo 837B Hilltop, Canadian City, ON Z34802
12345 Circle Drive, Lakeview, MN                    12345 Circle Drive, Lakeview, MN