Сопоставьте шаблон с некоторым условием и замените его некоторой строкой с помощью regexp_replace в Oracle - PullRequest
0 голосов
/ 29 мая 2020

У меня есть требование идентифицировать конкретную строку в тексте, используя следующие условия:

* 1. Любая строка, содержащая пробелы до и после нее ИЛИ

Любая строка, содержащая. (точка) в качестве префикса и пробел в качестве суффикса ИЛИ

Любая строка, имеющая пробел в качестве префикса и (запятая) в качестве суффикса *

Однажды найденная , мне нужно заменить его другой строкой, не заменяя префикс и суффикс, как указано выше. И это нужно сделать в коде pl / sql в Oracle (желательно с использованием функции regexp_replace).

Пример:

Текст: 'This, is a sample_text, which_needs_.to_be_replaced as per, the matching.criteria.defined above,'

Заменить строку: 'replaced'

Вывод: 'This, replaced replaced replaced, which_needs_.replaced replaced replaced, replaced matching.criteria.replaced replaced'

Я знаю, что это странный пример, но фактическое требование еще более странное, чем это. Пожалуйста, объясните мне, как этого добиться.

Заранее благодарю

1 Ответ

1 голос
/ 29 мая 2020

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

...