Regexp Oracle удалить все после почтового индекса в формате США и Канады
У меня есть форматы адресов, которые похожи
123, улица abc, Даллас, Tx 75701, 500-998-7898, Направления X Y Z к западу от
Я хочу удалить что-либо после почтового индекса, соответствующего американскому формату в 5-значном или 5-значном + 4-значном формате, а также в формате канадского почтового индекса, например Y89 567 или Y89567.
Так что мой окончательный ответ должен выглядеть так.
Ул. Abc 123, Даллас, Tx 75701
Ценю любую помощь.
1 ответ
Вот один из способов сделать это. Обратите внимание, что все, что "похоже" на почтовый индекс США или Канады, будет считаться одним из них. Кроме того, вы пропустите такие вещи, как Beverly Hills, Calif. 90210
потому что "Калифорния". не "рассматривается" как код штата. Я также немного небрежен; если после почтового индекса есть что-то, это не должна быть буква или цифра. Я не написал "тест" для этого; оставлено как упражнение, если это необходимо.
Я предполагаю, что если почтовый индекс не найден, должна быть возвращена вся входная строка.
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