Вместо того, чтобы пытаться написать одно гигантское регулярное выражение, может быть проще разбить строку на строки для каждого токена. Вы можете сделать это, адаптировав любой из методов преобразования CSV в строки. например:
with rws as (
select 'This, is a sample_text, which_needs_.to_be_replaced as per, the matching.criteria.defined above,' str from dual
), vals as (
select regexp_substr(str,'[A-z_,]+(\.|\s)?', 1, level) str, level l
from rws
connect by regexp_substr(str, '[^, .]+', 1, level) is not null
)
select * from vals;
STR L
This, 1
is 2
a 3
sample_text, 4
which_needs_. 5
to_be_replaced 6
as 7
per, 8
the 9
matching. 10
criteria. 11
defined 12
above, 13
Теперь замените каждый из них в соответствии с вашими правилами. Вы имеете дело только с одним токеном за раз, поэтому легко увидеть, какой из них вы заменяете правильно. Это упрощает написание и отладку регулярного выражения:
with rws as (
select 'This, is a sample_text, which_needs_.to_be_replaced as per, the matching.criteria.defined above,' str from dual
), vals as (
select regexp_substr(str,'[A-z_,]+(\.|\s)?', 1, level) str, level l
from rws
connect by regexp_substr(str, '[^, .]+', 1, level) is not null
)
select case
when l = 1 then str
when substr ( str, -1, 1 ) = '.' then
str
else
regexp_replace (
str,
'^[A-z_]+',
'replaced'
)
end replaced, l
from vals;
REPLACED L
This, 1
replaced 2
replaced 3
replaced, 4
which_needs_. 5
replaced 6
replaced 7
replaced, 8
replaced 9
matching. 10
criteria. 11
replaced 12
replaced, 13
Затем вы listagg
снова объединяете значения, чтобы получить окончательную строку:
with rws as (
select 'This, is a sample_text, which_needs_.to_be_replaced as per, the matching.criteria.defined above,' str from dual
), vals as (
select regexp_substr(str,'[A-z_,]+(\.|\s)?', 1, level) str, level l
from rws
connect by regexp_substr(str, '[^, .]+', 1, level) is not null
), replaces as (
select case
when l = 1 then str
when substr ( str, -1, 1 ) = '.' then
str
else
regexp_replace (
str,
'[A-z_]+',
'replaced'
)
end replaced, l
from vals
)
select listagg ( replaced )
within group ( order by l ) s
from replaces;
S
This, replaced replaced replaced, which_needs_.replaced replaced replaced, replaced matching.criteria.replaced replaced,
Убедитесь, что вы тщательно протестировали! По моему опыту, вы найдете больше исключений / уточнений, когда у вас есть такие сложные правила. Так что, вероятно, вам придется повозиться с правилами замены в выражении case.