Использование Oracle Regular Expression - Маскирование на основе шаблона

Убираться ,

With Oracle 11g PL/SQL, for below query, can I get the capture groups' positions (something like what Matcher.start() provides in java).

    `select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') from dual`

Результат должен выглядеть так: «зона», 9 (начало текста «зона»).

Большей проблемой, которую я пытался решить, является маскирование данных, таких как номер счета, с использованием таких шаблонов, как «^ ..... (. *) .. $ '(этот шаблон может меняться в зависимости от установки).

0
nl ja de
Я с @tbone здесь; Я понятия не имею, что вы пытаетесь замаскировать, и о том, как вы хотите, как после.
добавлено автор Ben, источник
@AjithSasidharan, вы должны подождать 2 дня , чтобы начать щедрость.
добавлено автор Ben, источник
Все еще немного смущен тем, что вы хотите точно. Можете ли вы дать простой пример ввода/вывода желаемых результатов?
добавлено автор tbone, источник
Начните щедрость!
добавлено автор Ajith Sasidharan, источник

2 ответы

1: Обратный шаблон с использованием этого

regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace (regexp_replace             (\() ',' \ 1 # '),' (\)) ',' # \ 1 '),' \ (# ',') # '),' \ ^ \) # ', '^'), '# \) \ $', '$'), '# \)', '(#'), '#', ''), '\ ^ ([^ \ (] + \) ) ',' ^ (\ 1 '),' \ (([^ \)] +) \ $ ',' (\ 1) $ ');

Итак, «^ (. ) .. (.). $"; становится "^. (..). (.) $";

2: Используйте это для подсчета количества и количества групп захвата в обоих шаблонах

SELECT REGEXP_instr(pattern, '\(.*?\)+', 1, LEVEL) bulk collect into posCapture FROM v CONNECT BY LEVEL <= REGEXP_COUNT(pattern, '\(.*?\)');

3: сопоставьте оба шаблона с текстом для маскировки. Объедините их по порядку, найденному на шаге 2.

выберите regexp_replace (v_src, pattern, '\' || captureIndex) в tempStr из dual;

0
добавлено

Будет ли что-то вроде ниже работать для вас?

выберите regexp_replace ('1234bankzone1234', '^ .. (. *) bank (zone). (. *) .. $', '\ 2') expr       , instr ('1234bankzone1234', regexp_replace ('1234bankzone1234', '^ .. (. *) bank (zone). (. *) .. $', '\ 2')) pos из двойного

или более читаемый подзапрос, например

выберите a. *, instr (a.value, a.expr) из (        выберите значение «1234bankzone1234»,         regexp_replace ('1234bankzone1234', '^ .. (. *) bank (zone). (. *) .. $', '\ 2') expr из double        ) a

Я не мог найти никакого прямого эквивалента API-интерфейса Matcher, так как вы не можете получить доступ к буферу группы позиций в SQL.

0
добавлено
В некоторых случаях это может вызвать проблемы.
добавлено автор Paddy, источник
В некоторых случаях это может вызвать проблемы. Если есть несколько групп захвата, а одно совпадение - подмножество другого (предположим, что 2 группы захвата имеют совпадение «зона» и «азон»), я пропущу один из них. С разными типами данных (идентификаторы устройств, учетная запись/PAN/клиент # и т. Д.) И несколькими установками риск увеличивается.
добавлено автор Paddy, источник
К сожалению, точный размер маскируемого текста и шаблон masknig могут отличаться. Маскирование требуется для нескольких установок для различных типов данных (номер счета, IP-адрес, даты ...). Для самого номера счета я видел как минимум 3 разных шаблона.
добавлено автор Paddy, источник
Это то, что я делаю сейчас: 1) Обратный шаблон маскировки. 2) Получите индексы и количество групп захвата как в исходных, так и в обратных шаблонах. 3) Получить соответствующий текст из исходной строки как для исходных, так и для обратных групп захвата паттерна. 4) Слить захваченный текст с шага 3 в соответствии с индексами, полученными на шаге 2. Маска совпадений с исходной строкой. Ниже я расскажу подробнее.
добавлено автор Paddy, источник
Это правда. Знаете ли вы, каков размер текста, который вы пытаетесь и замаскируете, и количество групп/шаблонов, которые у вас есть в них? Причина, по которой я спрашиваю, группируется таким образом, что это больше разделение строк и объединение их. Пока у вас есть <5-7 отдельных групп, которые мы можем сделать в SQL.
добавлено автор Baski, источник
Oracle RU
Oracle RU
303 участник(ов)

Русскоязычная группа по Oracle. — Архитектура СУБД — PL/SQL — Оптимизация — Администрирование — Вакансии Oracle (указать инфу по вилке ЗП и удалёнке) Приглашайте коллег :-) Запрещены: личные оскорбления, обсуждения оффтопик вопросов политики и религии