Функция Oracle REGEX_REPLACE и группы захвата - PullRequest
0 голосов
/ 01 марта 2019

У меня есть строка, которую я хотел бы преобразовать из последовательности строк в последовательность строк, разделенных дефисом.Пример

200400116828 --> 2004-001168-28 

Для преобразования строки входная строка должна соответствовать следующим правилам:

- Starts with a 1 or 2
- Followed by three digits
- Followed by 6 digits
- Followed by 2 digits

Я использую регулярное выражение для извлечения вышеуказанных групп из входной строки для построения выходных данных.строка с использованием регулярного выражения '^([12]\d{3})(\d{6})(\d{2})$'

Мне удалось заставить его работать, используя следующий запрос:

Select REGEXP_REPLACE(
            '200400116828','^([12]\d{3})(\d{6})(\d{2})$','\1-\2-\3'
          ) from dual;

Вывод - 2004-001168-28

Но меня смущает, что следующий запрос также работает, но с неправильным выводом:

Select REGEXP_REPLACE(
            '200400116828','^([12]\d{3})(\d{6})(\d{2})$','\10-\11-\12'
          ) from dual;

Вывод - 20040-20041-20042

Может кто-нибудь объяснить, пожалуйста,вывод 2-го запроса, потому что для меня это не соответствует RegEx обеспечить.

1 Ответ

0 голосов
/ 01 марта 2019

Регулярное выражение в порядке, вы запутались с шаблоном замены.

Механизм Oracle regex основан на POSIX, а шаблоны замены поддерживают только обратные ссылки с 1 по 9. То, что не может быть проанализировано, так как обратная ссылка анализируетсякак буквальный текст.

Следовательно, \10-\11-\12 анализируется как значение группы 1, 0-, значение группы 1, 1-, значение группы 1, 2.

Также см. regexp_replace документация :

replace_string может содержать до 500 обратных ссылок на подвыражения в форме \n, где n - это число отОт 1 до 9.

...