Вы можете попробовать этот шаблон:
REGEXP_REPLACE(s,'([a-zA-Z]+,[0-9]+\s+)([^a-zA-Z0-9])(\s+[a-zA-Z]+)','\1group(\2)\3')
Я не использовал регулярное выражение Posix, которое вы использовали для простоты, и использовал [a-zA-Z]
для алфавита и [0-9]
для цифр.\s*?
представляет ноль или более пробелов.
[^a-zA-Z0-9]
пытается сопоставить ваш оператор, но он может совпадать с вашими действительными операторами, поэтому вы можете явно указать их как (\+|-|\*|=)
вместо этого, если вы уверены во всех возможных операторах.
Я поместил левый операнд, оператор и правый оператор как группы (\1
), (\2
) и (\3
) соответственно.
SQL>
SQL> with t(s) AS
2 (
3 SELECT 'G,1=G' FROM DUAL UNION ALL
4 SELECT 'AB,13 + H' FROM DUAL UNION ALL
5 SELECT 'BCD,1 * ID' FROM DUAL
6 )
7 select s,REGEXP_REPLACE(s,'([a-zA-Z]+,[0-9]+\s*?)([^a-zA-Z0-9])(\s*?[a-zA-Z]+)'
8 ,'\1group(\2)\3')
9 as m
10 FROM t;
S M
-- --
G,1=G G,1group(=)G
AB,13 + H AB,13 group(+) H
BCD,1 * ID BCD,1 group(*) ID
Демонстрация
Кроме того, если вы не хотите, чтобы шаблон был конкретным до или после оператора, и только хотите сгруппировать оператора, вы можете использовать:
REGEXP_REPLACE(s,'([^\+-\*=]+)(\+|-|\*|=)([^\+-\*=]+)'
,'\1group(\2)\3')