如何更有效地找到PL / SQL中分隔符之间的子串?

时间:2015-03-16 18:52:32

标签: regex oracle plsql

现在我这样做:

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;

我怎么能以不同的方式做到这一点?

如何更有效地完成这项工作?

2 个答案:

答案 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;