Контекст - это SQL в AS / 400 (IBM i)
Моя цель - получить два значения: строку, определяемую регулярным выражением, которое у меня уже есть, а затем все остальное в исходной строке срезультат регулярного выражения удален, и разрыв (если есть) закрылся.
Вот SQL:
select HAD1,
regexp_substr(HAD1,'\b(GATE|LEVEL|DOOR|UNITS?)\s[\dA-Z]{1,}'),
regexp_substr(HAD1,'**eventual_regex_goes_here**')
from ECH
where regexp_like(HAD1,'\bGATE')
И желаемый результат:
Ship To REGEXP_SUBSTR REGEXP_SUBSTR
Address
D2 COMPOUND, GATE 11 GATE 11 D2 COMPOUND,
2/22 GATEWAY DRIVE - 2/22 GATEWAY DRIVE
ASHBURTON FITTINGS GATE 2 GATE 2 ASHBURTON FITTINGS
BRIERLY RD, GATE A, RIVER SIDE GATE A BRIERLY RD, , RIVER SIDE
GATE 16, 37 KENEPURU DRIVE GATE 16 , 37 KENEPURU DRIVE
Если бы второе выражение тоже могло вывести запятые, это было бы здорово, но этоне требуется.Оставшаяся строка будет подвергнута другой (не-регулярной) обработке для удаления посторонних элементов (телефонных номеров, комментариев, знаков препинания и т. Д.)one , который дал следующую строку:
^.+?(?=\d{2})|(?<=\d{2}).+$
Итак, сначала я попытался поместить все свое выражение вместо обоих вхождений \d{2}
и обнаружил, что это (неудивительно) не будет обрабатываться.Затем я вернулся к более простому тесту и попытался создать его оттуда.
Давайте попробуем просто слово GATE как константу плюс пару границ (потому что в глубине души я все еще ребенок,и вы знаете, что они говорят: «Детям нужны границы»).
select had1,
regexp_substr(HAD1,'\b(GATE|LEVEL|DOOR|UNITS?)\s[\dA-Z]{1,}'),
regexp_substr(HAD1,'^.+?(?=\bGATE\b)|(?<=\bGATE\b).+$')
from ech
where regexp_like(HAD1,'\bGATE')
Результат:
Ship To REGEXP_SUBSTR REGEXP_SUBSTR
Address
GATE 3, CNR QUARRY ROAD GATE 3 3, CNR QUARRY ROAD
ASHBURTON FITTINGS GATE 2 GATE 2 ASHBURTON FITTINGS
GATE 6, HELLABYS ROAD GATE 6 6, HELLABYS ROAD
GATE 3, 548 PAKAKARIKI HILL GATE 3 3, 548 PAKAKARIKI HILL
GATE 5 - FLIGHTYS COMPOUND GATE 5 5 - FLIGHTYS COMPOUND
GATE 3 - 548 PAEKAKARIKI HILL ROAD GATE 3 3 - 548 PAEKAKARIKI HILL ROAD
GATE 14 - TAKAPU COMPOUND GATE 14 14 - TAKAPU COMPOUND
35 GATEWAY DRIVE - -
GATE 6 GATE 6 6
TAKAPU ROAD,GATE 20,SH1 GATE 20 TAKAPU ROAD,
Это выглядит многообещающе, учитывая, что я не использую полныйвыражение для второго столбца результата.Но тут уже одна вещь не так.
Во втором и последнем ряду должно быть больше данных, '2' и ', SH1' соответственно.И строка «35 GATEWAY DRIVE» должна быть в последнем столбце.Я хочу все за исключением того, что находит выражение (которое на данный момент является целым словом GATE, запомните).
Кажется, он может вернуть оставшийся текст с одной или другой стороны удаленного текста, но не оба, и не весь оставшийся текст, если ничего не найдено для удаления.Так что нет смысла нажимать на добавление более изощренных тем, чтобы включить номер ворот, пока я не пойму, почему я не получаю весь текст, который не GATE .Поэтому я остановлюсь здесь и буду просить о помощи.