我有一个字符串,我想从一系列字符串转换为由连字符分隔的字符串序列。例
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提供的不匹配。
正则表达式很好,你对替换模式感到困惑。
Oracle正则表达式引擎是基于POSIX的,替换模式仅支持从1到9的反向引用。无法解析为反向引用的内容被解析为文本文本。
因此,\10-\11-\12
被解析为第1组值,0-
,第1组值,1-
,第1组值,2
。
另外,请参阅regexp_replace
documentation:
replace_string
可以包含\n
形式的子表达式的多达500个反向引用,其中n
是1到9的数字。