正则表达式REGEXP_SUBSTR拆分为列

问题描述

您能帮我写一个正则表达式将字符串分成几列吗?

输入:

select REGEXP_SUBSTR ('/D 1/D 18/15/1000',xxxx)  from dual ;

select REGEXP_SUBSTR ('/D 1/D 18/15',xxxx)   from dual ;

输出

col1>D 1<  col2 >D 18< col3 >15<  col4>1000<

col1>D 1< col2>D 18< col3>15<

结果应带列。因此,这意味着我想分成几列。

解决方法

REGEXP_SUBSTR返回字符串subject中与正则表达式pattern匹配的部分。您可以使用REGEXP_REPLACE,它允许您使用正则表达式模式匹配将字符串中的字符序列替换为另一组字符。

select REGEXP_REPLACE ('/D 1/D 18/15/1000','\/(\w+)','\1')  from dual ;
,

要获得期望的输出,无需使用正则表达式。您可以使用简单的REPLACE来将/替换为空格,然后从字符串的末尾修剪所有空格。

SQL> SELECT TRIM (REPLACE ('/D 1/D 18/15/1000','/',' ')) AS sample_data FROM DUAL;


        SAMPLE_DATA
___________________
D 1 D 18 15 1000


SQL> SELECT TRIM (REPLACE ('/D 1/D 18/15',' ')) AS sample_data FROM DUAL;


   SAMPLE_DATA
______________
D 1 D 18 15

更新

根据注释中的信息,应将值分为不同的列。通过使用/作为分隔符进行拆分,可以使用下面的正则表达式获取不同的值。

SQL> WITH sample_data AS (SELECT '/D 1/D 18/15/1000' AS sample_col FROM DUAL)
  2  SELECT regexp_substr(sample_col,'[^/]+',1,1) as col1,3         regexp_substr(sample_col,2) as col2,4         regexp_substr(sample_col,3) as col3,5         regexp_substr(sample_col,4) as col4,6         regexp_substr(sample_col,5) as col5
  7    FROM sample_data;


   COL1    COL2    COL3    COL4    COL5
_______ _______ _______ _______ _______
D 1     D 18    15      1000


SQL> WITH sample_data AS (SELECT '/D 1/D 18/15' AS sample_col FROM DUAL)
  2  SELECT regexp_substr(sample_col,5) as col5
  7    FROM sample_data;


   COL1    COL2    COL3    COL4    COL5
_______ _______ _______ _______ _______
D 1     D 18    15