使用oracle regexp_replace仅删除一组

时间:2019-01-31 23:30:45

标签: regex oracle regexp-replace

我有一个字符串“ hello big world”,我想删除“ big world”,以便最终结果字符串只是“ hello”。我不知道那会很难。我最接近的是:

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 :(得分:1)

它返回大世界,因为这就是您的代码所说的。 regexp_replace函数中的最后一个参数是替换字符串。如果您要删除大世界,请搜索它并使用一个空字符串作为替换,即

regexp_replace(l_string, 'big world', '')

答案 1 :(得分:0)

您可以使用此:

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

您的代码有2个问题:

  • 首先在pattern中使用$,这意味着oracle仅在字符串结尾之前搜索匹配项,因此对于字符串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