Regexp_replace处理结果

时间:2016-10-20 08:15:45

标签: sql regex oracle

我有一组包含nubmers的字符串。并且我想制作恒定长度的字符串。现在我使用两个regexp_replace。首先在字符串中添加10个数字,然后在剪切字符串旁边添加10个数字:

with s(txt) as ( select '1030123:12031:1341' from dual)
select regexp_replace(
       regexp_replace(txt, '(\d+)','0000000000\1')
,'\d+(\d{10})','\1') from s ;

但我喜欢只使用一个类似

的正则表达式
regexp_replace(txt, '(\d+)',lpad('\1',10,'0'))

但它不起作用。 lpad在regexp之前执行。你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

采用略有不同的方法,您可以尝试以下方法:

with s(id, txt) as
(
    select rownum, txt
    from (
            select '1030123:12031:1341' as txt from dual union all
            select '1234:0123456789:1341' from dual
         )
)                 
SELECT listagg(lpad(regexp_substr(s.txt, '[^:]+', 1, lines.column_value), 10, '0'), ':') within group (order by column_value) txt
 FROM s,
   TABLE (CAST (MULTISET
   (SELECT LEVEL FROM dual CONNECT BY instr(s.txt, ':', 1, LEVEL - 1) > 0
   ) AS sys.odciNumberList )) lines
group by id

TXT
-----------------------------------
0001030123:0000012031:0000001341
0000001234:0123456789:0000001341

这使用CONNECT BY根据分隔符':'拆分每个字符串,然后使用LPAD填充到10,然后聚合字符串以构建包含填充值串联的行

答案 1 :(得分:0)

这适用于非空序列(例如123 :: 456)

with s(txt) as ( select '1030123:12031:1341' from dual)

select    regexp_replace (regexp_replace (txt,'(\d+)',lpad('0',10,'0') || '\1'),'0*(\d{10})','\1')

from      s
;