regexp_substr получить последние два слова с конца предложения в Oracle SQL

У меня есть строка: ON P6B 0B8. Мне нужен вывод: P6B OB8.

Я могу использовать regexp_substr('ON P6B 0B8','[^ ]+$',1), чтобы получить последнее слово в конце предложения. Но как мне получить слово после пробела — второе слово с конца?

Как мне сказать regexp_substr не останавливаться на первой клетке, если смотреть сзади, а вместо этого двигаться дальше, пока она не наткнется на вторую клетку?

Мне было трудно понять метасимволы, предоставляемые регулярным выражением Oracle.


person Ravi Chilakamarthi    schedule 01.12.2017    source источник


Ответы (1)


Вот регулярное выражение, которое получит последние 2 набора символов из вашей строки. Поскольку кажется, что вы получаете канадский почтовый индекс, вы можете быть немного осторожнее.

Предложение 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; 
person Gary_W    schedule 01.12.2017