Oracle REGEX_REPLACE函数和捕获组

时间:2019-03-01 13:59:02

标签: sql regex oracle oracle11g oracle10g

我有一个字符串,我希望将其从一个字符串序列转换为一个由连字符分隔的字符串序列。例子

200400116828 --> 2004-001168-28 

要转换字符串,输入字符串必须遵循以下规则:

- Starts with a 1 or 2
- Followed by three digits
- Followed by 6 digits
- Followed by 2 digits

我使用正则表达式从输入字符串中提取以上组,并使用正则表达式'^([12]\d{3})(\d{6})(\d{2})$'

构建输出字符串

我设法使用以下查询使其工作:

Select REGEXP_REPLACE(
            '200400116828','^([12]\d{3})(\d{6})(\d{2})$','\1-\2-\3'
          ) from dual;

输出-2004-001168-28

但是我对以下查询感到困惑,但它也可以正常工作,但是输出错误:

Select REGEXP_REPLACE(
            '200400116828','^([12]\d{3})(\d{6})(\d{2})$','\10-\11-\12'
          ) from dual;

输出-20040-20041-20042

有人可以解释第二个查询的输出,因为对我而言,它与RegEx提供的不匹配。

1 个答案:

答案 0 :(得分:2)

正则表达式很好,您对替换模式感到困惑。

Oracle regex引擎基于POSIX,替换模式仅支持1到9的反向引用。不能解析为反向引用的内容被解析为文字文本。

因此,\10-\11-\12被解析为组1值0-,组1值1-,组1值2

另外,请参见regexp_replace documentation

  

replace_string 最多可包含500个对子表达式的反向引用,格式为\n,其中n是1到9的数字。