Маскировка каждого слова в предложении, кроме первой и последней буквы с фиксированным количеством звездочек - PullRequest
1 голос
/ 18 февраля 2020

Я хочу замаскировать, кроме первой и последней буквы слова в предложении в oracle.

Мой запрос:

select regexp_replace('Hello World', '(?<!^.?).(?!.?$)','*') as str2
   from dual;

результат: Hello World

Ожидаемый результат: H *** o W *** d

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы можете использовать

SELECT REGEXP_REPLACE('Hello World', '(\w)\w*(\w)', '\1***\2') as str2 from dual

См. онлайн-демонстрацию

Регламент будет соответствовать не менее двухбуквенным словам, поэтому любое однобуквенное слово будет остаются неизменными.

Детали шаблона

  • (\w) - Группа 1 (позднее, упоминается через \1): любое слово (буква, ди git или _) char
  • \w* - любое число символов 0+ из максимально возможного числа
  • (\w) - группа 2 (позже, через \2): любое слово char.

Шаблон замены \1***\2 заменяет совпадение содержимым группы 1, затем тремя звездочками (отрегулируйте по своему усмотрению), а затем содержимым группы 2.

0 голосов
/ 18 февраля 2020

Если вы хотите, чтобы слова имели одинаковую длину и отмечали звездочкой каждый символ, кроме первого и последнего, вы не можете сделать это с помощью простого регулярного выражения (так как Oracle не поддерживает упреждающий просмотр в регулярных выражениях) ). Но вы можете сделать это с помощью рекурсивного факторинга подзапроса, который рекурсивно находит каждое слово и выполняет маскировку этого слова, а затем рассматривает следующее слово в строке:

WITH replacements ( value, before, word, pos ) AS (
  SELECT value,
         CASE REGEXP_INSTR( value, '[[:alnum:]]+', 1, 1, 0 )
         WHEN 0
         THEN value
         ELSE SUBSTR(
                value,
                1,
                REGEXP_INSTR( value, '[[:alnum:]]+', 1, 1, 0 ) - 1
              )
         END,
         SUBSTR(
           value,
           REGEXP_INSTR( value, '[[:alnum:]]+', 1, 1, 0 ),
           REGEXP_INSTR( value, '[[:alnum:]]+', 1, 1, 1 )
           - REGEXP_INSTR( value, '[[:alnum:]]+', 1, 1, 0 )
         ),
         REGEXP_INSTR( value, '[[:alnum:]]+', 1, 1, 1 )
  FROM   test_data
UNION ALL
  SELECT value,
         before
         || CASE
            WHEN LENGTH(word) < 3
            THEN word
            ELSE SUBSTR(word,1,1) || LPAD( SUBSTR(word,-1), LENGTH(word)-1, '*' )
            END
         || CASE REGEXP_INSTR( value, '[[:alnum:]]+', pos, 1, 0 )
            WHEN 0
            THEN SUBSTR( value, pos )
            ELSE SUBSTR(
                   value,
                   pos,
                   REGEXP_INSTR( value, '[[:alnum:]]+', pos, 1, 0 ) - pos
                 )
            END,
         SUBSTR(
           value,
           REGEXP_INSTR( value, '[[:alnum:]]+', pos, 1, 0 ),
           REGEXP_INSTR( value, '[[:alnum:]]+', pos, 1, 1 )
           - REGEXP_INSTR( value, '[[:alnum:]]+', pos, 1, 0 )
         ),
         REGEXP_INSTR( value, '[[:alnum:]]+', pos, 1, 1 )
  FROM   replacements
  WHERE  pos > 0
)
SELECT value,
       before AS replaced_value
FROM   replacements
WHERE  pos = 0

Итак, для тестовых данных:

CREATE TABLE test_data( value ) AS
SELECT 'Hello World' FROM DUAL UNION ALL
SELECT 'A short sentence, with a "quote".' FROM DUAL UNION ALL
SELECT 'Some numbers 1000, 2000' FROM DUAL UNION ALL
SELECT '==Hello==World==' FROM DUAL UNION ALL
SELECT 'Be in at 10' FROM DUAL UNION ALL
SELECT '"!!!!"' FROM DUAL

Это выводит:

VALUE                             | REPLACED_VALUE                   
:-------------------------------- | :--------------------------------
"!!!!"                            | "!!!!"                           
Hello World                       | H***o W***d                      
==Hello==World==                  | ==H***o==W***d==                 
Some numbers 1000, 2000           | S**e n*****s 1**0, 2**0          
Be in at 10                       | Be in at 10                      
A short sentence, with a "quote". | A s***t s******e, w**h a "q***e".

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...