Удаление только одной группы с помощью оракула regexp_replace - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть строка «привет большой мир», и я хочу удалить «большой мир», чтобы строка конечного результата была просто «привет».Я не знал, что это будет так сложно.Самое близкое, что у меня было:

declare
 l_string varchar2(40);
 begin
    l_string := 'hello big world,';
    dbms_output.put_line(l_string);
    l_string := regexp_replace(l_string, 'hello (.*),$', '\1');
    dbms_output.put_line(l_string); -- it returns 'big world' and that's the part I want to remove 
 end;
 /

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы можете использовать это:

l_string := regexp_replace(l_string, 'hello [^,]*,', 'hello,');

Ваш код имеет 2 проблемы:

  • Сначала в pattern, вы используете $, что означает, что оракулискать только совпадение непосредственно перед концом строки, поэтому для строки hello big world, hello big earth, hello big sun oracle никогда не совпадет с частью hello big world, или hello big earth,

  • Вторым является то, что в replace_string выиспользуйте обратную ссылку \1, отмечая ссылку в части, которую хотите удалить, - (.*) вместо части, которую хотите сохранить, - hello.Если вы хотите использовать обратную ссылку, тогда она должна быть regexp_replace(l_string, '(hello) [^,]*,', '\1,');

См. Документы REGEXP_REPLACE

0 голосов
/ 01 февраля 2019

Возвращает большой мир , потому что так говорит ваш код.Последний параметр в функции regexp_replace является строкой замены.Если вы хотите удалить большой мир , найдите его и используйте в качестве замены пустую строку, например

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