Oracle REGEXP_REPLACE函数和捕获组

问题描述 投票:1回答:1

我有一个字符串,我想从一系列字符串转换为由连字符分隔的字符串序列。例

200400116828 --> 2004-001168-28 

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

- 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提供的不匹配。

sql regex oracle oracle11g oracle10g
1个回答
2
投票

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

Oracle正则表达式引擎是基于POSIX的,替换模式仅支持从1到9的反向引用。无法解析为反向引用的内容被解析为文本文本。

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

另外,请参阅regexp_replace documentation

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

© www.soinside.com 2019 - 2024. All rights reserved.