Regex возвращает другой результат в той же строке в Oracle - PullRequest
0 голосов
/ 07 мая 2019

Я извлекаю почтовые индексы из списка строк, используя REGEXP_REPLACE в Oracle. Когда я проверяю регулярное выражение в строке, почтовый индекс извлекается правильно. Однако, когда я перемещаю регулярное выражение в производство на VIEW в Oracle, я получаю другие результаты от регулярного выражения на той же самой строке.

Следующая строка появляется дважды в моем ПРОСМОТРЕ:

;2;5;1;1;Company Name;1;Location;1;12 Street;1;City, US-IL 13012;1;US;

Я использую следующее утверждение в VIEW для захвата почтового индекса

REGEXP_REPLACE (tb."ADDRESS", '.*([A-Z]{2}[0-9]?-[A-Z0-9]* ?|, ?)([^;]{0,10}|);[0-9];[A-Z]{2};', '\2 ')
  • При первом появлении строки регулярное выражение извлекает "US-IL"
  • При первом появлении строки регулярное выражение извлекает "13012"

Есть идеи, почему я получаю разные результаты от одного и того же регулярного выражения? Я пытался отладить его, переписать регулярное выражение, но я в тупике. Я ожидаю, что регулярное выражение возвратит «13012» для обоих вхождений этой строки.

N.B. Регулярное выражение должно быть достаточно гибким, чтобы собирать почтовые индексы и почтовые индексы для многих разных стран, мой набор данных предназначен не только для адресов США.

1 Ответ

0 голосов
/ 07 мая 2019

Вы должны использовать REGEXP_SUBSTR для извлечения нужной вам части строки.

Пример:

REGEXP_SUBSTR(col, '\s+(\d{5});[0-9];[A-Z]{2};', 1, 1, NULL, 1)

См. регулярное выражение и Oracle demo . График регулярных выражений:

enter image description here

Regex

  • \s+ - 1+ пробелов
  • (\d{5}) - Группа 1 (результат) "пять цифр
  • ;[0-9];[A-Z]{2}; - ;, цифра, ;, 2 заглавные буквы, ;.

Если вы планируете придерживаться своего конкретного регулярного выражения, обратите внимание, что реальное значение находится в группе 2. Итак, вам нужно указать 2 в качестве последнего аргумента REGEXP_SUBSTR:

REGEXP_SUBSTR(col, 
      '.*([A-Z]{2}[0-9]?-[A-Z0-9]* ?|, ?)([^;]{0,10}|);[0-9];[A-Z]{2};',
      1, 1, NULL, 2)

См. эту демонстрацию Oracle .

...