我有一个字符串:ON P6B 0B8
。我需要的输出是:P6B OB8
。
我可以使用regexp_substr('ON P6B 0B8','[^ ]+$',1)
从句子末尾获取最后一个单词。但是我怎么能在空格后得到这个词 - 从结尾开始的第二个词呢?
当我从后面看时,如何告诉regexp_substr
不要在第一个空间停留,而是继续前进直到它到达第二个空间?
我很难理解Oracle regexp提供的元字符。
答案 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;