Oracle Regex заменить с условием - PullRequest
2 голосов
/ 23 марта 2020

Я новичок в использовании RegEx и пытаюсь применить REGEXP_REPLACE с условиями, если существует специальный символ, тогда применить регулярное выражение, иначе применить другое регулярное выражение, например

SELECT REGEXP_REPLACE ('PCB terminal block - FRONT 2,5-V/SA 5/10 BK - 1109601', '([^\-]+$)' , '')  FROM dual;

output

PCB terminal block - FRONT 2,5-V/SA 5/10 BK -

выше регулярного выражения удалить после последней (-), и все в порядке

, но если моя строка не содержит (-), то это возвратит ноль, как показано ниже

SELECT REGEXP_REPLACE ('PCB terminal block, nominal current: 4 A, rated voltage (III/2): 250 V, nominal cross section', '([^\-]+$)' , '')  froM dual

output

null

Я хочу изменить это регулярное выражение, чтобы оно возвращало строку, если она не содержит (-) это возможно?

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Проблема в том, что ваше оригинальное выражение слишком широкое. Он соответствует последовательности символов, отличных от da sh (-) в конце строки: поэтому, если строка не содержит da sh, она полностью совпадает и подавляется.

Вы можете добавить da sh к регулярному выражению, чтобы оно было частью совпадения. Несоответствующие строки остаются нетронутыми REGEXP_REPLACE():

SELECT REGEXP_REPLACE (mycol, '-[^-]+$' , '-')  FROM dual;

Демонстрация на DB Fiddle :

with t as (
    select 'PCB terminal block, nominal current: 4 A, rated voltage (III/2): 250 V, nominal cross section' mycol from dual
    union all select 'PCB terminal block - FRONT 2,5-V/SA 5/10 BK - 1109601' from dual
)
select mycol, regexp_replace(mycol,  '-[^-]+$' , '-') from t
MYCOL                                                                                         | REGEXP_REPLACE(MYCOL,'-[^-]+$','-')                                                          
:-------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------
PCB terminal block, nominal current: 4 A, rated voltage (III/2): 250 V, nominal cross section | PCB terminal block, nominal current: 4 A, rated voltage (III/2): 250 V, nominal cross section
PCB terminal block - FRONT 2,5-V/SA 5/10 BK - 1109601                                         | PCB terminal block - FRONT 2,5-V/SA 5/10 BK -                                                

Обратите внимание, что не требуется и не требуется экранировать da sh в классе символов.

1 голос
/ 23 марта 2020

Вы также можете сделать это, используя подстановку:

regexp_replace(col,  '(^.*-)[^-]+$' , '\1')

Идея состоит в том, чтобы идентифицировать часть строки, которую вы хотите сохранить - это часть в скобках. Остальное говорит: «все, что не является дефисом до конца строки».

Это работает, потому что если нет совпадения (то есть нет дефиса), то не происходит подстановка и возвращается вся строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...