【问题标题】:Regexp_replace processing resultregexp_replace 处理结果
【发布时间】:2016-10-20 17:48:23
【问题描述】:

我有一个包含数组数字的字符串。我想制作恒定长度的字符串。现在我使用两个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 在正则表达式之前执行。你有什么想法吗?

【问题讨论】:

  • 组数是否总是相同,即 3?
  • 没有。现在它可能是从 1 到 5 的任意组数。但我想为任意组数制定解决方案

标签: sql regex oracle


【解决方案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,然后聚合字符串以构建包含填充值串联的行

【讨论】:

  • 谢谢。我想想。但是放在大桌子上就太贵了
  • 在你的结果组中是混合的
【解决方案2】:

这适用于非空序列(例如 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
;

【讨论】:

  • 但是和我目前的解决方案一样吗?
  • 你这里有一个空格:'\d+ (\d{10})
  • @Zhenora ,您好,既然这是正确答案,您介意将其标记为正确答案吗?
  • 是的,它的正确答案,但它和我的一样。两个 regexp_replace 以结束
  • @Zhenora,你的没用,这就是你发布这个问题的原因。在我指出错误在哪里之后,您修复了它,即使这是一个非常小的错误。我留给你决定是否承认这一点的机会。无论如何,我很高兴能提供帮助。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2012-11-26
  • 2016-10-22
  • 2023-04-07
  • 2015-12-27
  • 2015-09-24
相关资源
最近更新 更多