Regexp_replace添加额外的字符

时间:2014-11-10 16:56:43

标签: sql oracle oracle11g

我在Oracle 11.2.0.3.0 / Toad for Oracle 11.6.1.6中使用以下查询:

select  regexp_replace('000010PARA197427'
                      ,'([0-9]*)([A-Z]*)([0-9]*)'
                      ,'\3-\2-\1') from dual

而不是达到我的预期,197427-PARA-000010。 我得到了197427-PARA-000010--

如果我将查询更改为:

select  regexp_replace('000010PARA197427'
                      ,'([0-9]*)([A-Z]*)([0-9]*)'
                      ,'\3-c\2-c\1') from dual

然后我得到197427-cPARA-c000010-c-c的结果。

它就像所有的文字都被附加到结果的末尾。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

不确定为什么会发生这种情况,但由于你只有*量词而没有锚定,所以你可能会得到一个空的匹配(或类似的东西)。

锚定模式(/^...$/)似乎有效。对任何量词使用+而不是*也适用于此示例。

SQL> select regexp_replace('000010PARA197427'
                          ,'([0-9]+)([A-Z]*)([0-9]*)'
                          ,'\3-\2-\1') foo from dual ;

FOO
------------------
197427-PARA-000010

SQL> select regexp_replace('000010PARA197427'
                          ,'^([0-9]*)([A-Z]*)([0-9]*)$'
                          ,'\3-\2-\1') foo from dual ;

FOO
------------------
197427-PARA-000010