问题描述
我刚刚在regexp_replace中发现了一个奇怪的不一致之处; 我不确定这是一个错误还是我不了解的功能。
产生以下产品
我期望两者都是 “8”,因为这两个表达式之间的唯一区别是第一个是使用 \ D和第二个- [^ \ d],在我看来,这应该是相同的。
select regexp_replace('x1234567y8z90', '^\D*\d*\D(\d{1,2}).*$', '\1') "\D" , regexp_replace('x1234567y8z90', '^[^\d]*\d*\D(\d{1,2}).*$', '\1') "^\d" from dual ;复制
产生以下产品
\D ^\d 8 90复制
我期望两者都是 “8”,因为这两个表达式之间的唯一区别是第一个是使用 \ D和第二个- [^ \ d],在我看来,这应该是相同的。
专家解答
这是因为Oracle数据库将方括号内的字符视为文字。所以:
[^ \ d]
意味着:
匹配任何不是的字符:
反斜杠
小写d
为了解决这个问题,用方括号包装 \ d。或使用其他表达式之一进行数字匹配:
[^ \ d]
意味着:
匹配任何不是的字符:
反斜杠
小写d
为了解决这个问题,用方括号包装 \ d。或使用其他表达式之一进行数字匹配:
select regexp_replace('x1234567y8z90', '^\D*\d*\D(\d{1,2}).*$', '\1') "\D" , regexp_replace('x1234567y8z90', '^[^[\d]]*\d*\D(\d{1,2}).*$', '\1') "^\d" , regexp_replace('x1234567y8z90', '^[^[:digit:]]*\d*\D(\d{1,2}).*$', '\1') ":digit:" , regexp_replace('x1234567y8z90', '^[^0-9]*\d*\D(\d{1,2}).*$', '\1') "^0-9" from dual; \D ^\d :digit: ^0-9 8 8 8 8复制
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1326次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
798次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
726次阅读
2025-03-06 09:41:49
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
468次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
363次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
316次阅读
2025-03-26 23:27:33
Oracle分区和执行计划相关的几个问题
听见风的声音
310次阅读
2025-03-07 08:51:42
数据库管理-第299期 数据库是否需要定期重启(20250306)
胖头鱼的鱼缸
252次阅读
2025-03-06 09:09:35
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
250次阅读
2025-03-19 14:41:51
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
245次阅读
2025-03-24 09:42:53