我有一个字符串“ 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;
/
答案 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