Ваш шаблон @(.*)(\.)?
соответствует @
, затем захватывает в Группу 1 любые 0+ символов, кроме символов разрыва строки, как можно больше, и затем пытается сопоставить необязательную точку, т.е. этот (\.)?
никогда не будет соответствоватьлюбой текст, но пустой. Неудивительно, что вы сопоставляете все после @
с шаблоном.
Вам необходимо использовать
SELECT REGEXP_REPLACE(col, '@[^.]*\.', '@xxx.')
Или, если вы хотите удалить только часть текста между ближайший @
и .
:
SELECT REGEXP_REPLACE(col, '@[^@.]*\.', '@xxx.')
Шаблон соответствует
@
- @
char [^.]*
- ноль или более вхождений любого символа, но .
\.
- точка.