regexp_substr从Oracle SQL中的句子末尾获取最后两个单词

时间:2017-12-01 03:38:41

标签: regexp-substr

我有一个字符串:ON P6B 0B8。我需要的输出是:P6B OB8

我可以使用regexp_substr('ON P6B 0B8','[^ ]+$',1)从句子末尾获取最后一个单词。但是我怎么能在空格后得到这个词 - 从结尾开始的第二个词呢?

当我从后面看时,如何告诉regexp_substr不要在第一个空间停留,而是继续前进直到它到达第二个空间?

我很难理解Oracle regexp提供的元字符。

1 个答案:

答案 0 :(得分:0)

这是一个正则表达式,可以从你的字符串中获取最后两组字符。因为看起来你正在获得加拿大邮政编码,但你可能想要更加小心。

WITH子句设置一个包含数据的表。请注意,第一行是有效的邮政编码格式,但第二行是错误的(连续2个字母)。始终为您的测试用例使用意外数据,您不需要任何意外,数据将始终包含意外。

第一个正则表达式匹配由字符串末尾的空格分隔的2组3个字符。乍一看这似乎没问题,但如果数据不好就会返回。要收紧它,请使用第二个正则表达式,它专门检查uppercase_letter-digit-uppercase_letter-space-digit-uppercase_letter-digit的加拿大邮政编码格式,如果找不到则返回NULL。也许你想通过NVL()调用捕获它并改为返回消息。

with tbl(str) as (
  select 'Windsor ON P6B 0B8' from dual union all
  select 'Windsor_bad_postcode ON A3C 9BB' from dual
)
select --regexp_substr(str, '.* (.{3} .{3})$', 1, 1, NULL, 1) postcode_w_bad
       regexp_substr(str, '.* ([A-Z]\d[A-Z] \d[A-Z]\d)$', 1, 1, NULL, 1) postcode
from tbl;