我有一组包含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之前执行。你有什么想法吗?
答案 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
;