现在我这样做:
declare
str varchar2(1000) := '1a2b3c / a1b2c3';
begin
dbms_output.enable;
dbms_output.put_line( regexp_replace(str, '(.*) / .*', '\1') );--1a2b3c
dbms_output.put_line( regexp_replace(str, '.* / (.*)', '\1') );--a1b2c3
end;
我怎么能以不同的方式做到这一点?
如何更有效地完成这项工作?
答案 0 :(得分:2)
使用INSTR()
并查找/
:
DECLARE
str varchar2(1000) := '1a2b3c / a1b2c3';
BEGIN
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE( TRIM( SUBSTR(str, 1, INSTR(str, '/') - 1) ) );
DBMS_OUTPUT.PUT_LINE( TRIM( SUBSTR(str, INSTR(str, '/') + 1, LENGTH(str) - INSTR(str, '/')) ) );
END;
您也可以使用REGEXP_SUBSTR()
,但如果您不想使用REGEXP_REPLACE()
,则可能根本不想使用正则表达式:
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE( TRIM( REGEXP_SUBSTR(str, '^[^\/]*') ) );
DBMS_OUTPUT.PUT_LINE( TRIM( REGEXP_SUBSTR(str, '[^\/]*$') ) );
答案 1 :(得分:0)
使用正则表达式:
WITH s AS (SELECT '1a2b3c / a1b2c3' txt, '[^/]+' regexp FROM DUAL)
SELECT REGEXP_SUBSTR (txt,
regexp,
1,
LEVEL)
FROM s
CONNECT BY REGEXP_SUBSTR (txt,
regexp,
1,
LEVEL)
IS NOT NULL;