暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle regexp_replace不一致

ASKTOM 2019-01-14
447

问题描述

我刚刚在regexp_replace中发现了一个奇怪的不一致之处; 我不确定这是一个错误还是我不了解的功能。

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。或使用其他表达式之一进行数字匹配:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论