Если вы хотите, чтобы слова имели одинаковую длину и отмечали звездочкой каждый символ, кроме первого и последнего, вы не можете сделать это с помощью простого регулярного выражения (так как 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".
дБ <> скрипка здесь