Regex - изолировать строку от большего слова - PullRequest
0 голосов
/ 30 июня 2019

Следующее регулярное выражение в 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, но разрешить до шести цифр.

Я поиграл с цифрами в фигурных скобках, но, похоже, они влияют только на количество возвращаемых символов, а не на то, сколько символов должно присутствовать.

...