Следующее регулярное выражение в DB2 SQL работает очень хорошо, чтобы получить дополнительные элементы из адреса (то есть не название улицы или номер). Для упрощения моего примера я ограничусь двумя случаями (UNIT или GATE), где HAD1 - это поле, содержащее первую строку адреса улицы:
select HAD1,
regexp_substr(HAD1,'(UNITS?|GATES?)\s[0-9A-Z]{1,}')
from ECH
where regexp_like(HAD1,'(UNIT|GATE)')
and length(trim(HAD1)) > 12
Я получаю это:
Ship To REGEXP_SUBSTR
Address
Line 1
UNIT 4, 117 MONTGOMORIE RD UNIT 4
END OF WAINUI RD, HIGHGATE -
UNIT 3, 37 TE ROTO DRIVE UNIT 3
GATE 6 52 MAHIA ROAD GATE 6
UNIT B 11 LANGSTONE LANE UNIT B
ASHBURTON FITTINGS GATE 2 GATE 2
GOODS: PLACEMAKERS - WESTGATE -
UNIT 3, 37 TE ROTO DRIVE UNIT 3
ASHBURTON FITTINGS GATE 2 GATE 2
SH 8A TARRAS-LUGGATE HIGHWAY GATE HIGHWAY
Что очень обнадеживает. Он правильно не поднял HIGHGATE или WESTGATE, потому что за ними не было пробела, а затем чего-то еще.
Но он взял LUGGATE (последняя строка), чего я не хочу. Итак, я хотел бы иметь возможность включить, что моим текстовым строкам не предшествует какой-либо символ.
Как вы можете догадаться, я абсолютный новичок в области регулярных выражений, поэтому спасибо за ваше терпение.
Редактировать
Теперь у меня есть самое замечательное регулярное выражение, вот так:
\b(GATE|LEVEL|DOOR|UNITS?)\s[\dA-Z]{1,}
Используя его для большого набора данных, я замечаю случайное нежелательное совпадение, когда, например, за GATE следует обычное английское слово:
THE THIRD GATE ON THE LEFT = GATE ON
За воротами, уровнями, дверями и единицами, которые я ищу, всегда будет следовать одно из следующего: (a) Число до 6 цифр (b) Одна буква (c) Число и одна буква возможно с тире
Examples:
UNIT 7A
GATE 6
GATE 31113
UNIT B
LEVEL B2
LEVEL 2B
UNIT D06
Итак, мой следующий вопрос: могу ли я ограничить количество букв во второй части выражения 0 или 1, но разрешить до шести цифр.
Я поиграл с цифрами в фигурных скобках, но, похоже, они влияют только на количество возвращаемых символов, а не на то, сколько символов должно присутствовать.