regexp_replace 的困难

Difficulties with regexp_replace

我想从 PSU 12.1.0.2.170117 得到 12.1.0.2.170117。模式 ([\d|\.]+) 似乎工作正常:https://regex101.com/r/bDCF0w/1

但是,它在 Oracle regexp_replace 中没有像预期的那样工作:http://sqlfiddle.com/#!4/53d64e/77。我想念什么吗?为什么它也 return PSU,而我只有 \d\。在我的表情中?

我的文字也可以是 PSU SOMTHING SOMTHING 12.1.0.2.170117 AND HERE SOME. 我的最终目标也是阅读前 3 个点。

这两个选项如何:

SQL> with test (col) as (select 'PSU 12.1.0.2.170117' from dual)
  2  select regexp_substr(col, '\d+.+') result1,
  3         substr(col, instr(col, ' ') + 1) result2
  4  from test;

RESULT1         RESULT2
--------------- ---------------
12.1.0.2.170117 12.1.0.2.170117

SQL>

[编辑]

嗯,你早该这么说。这是另一个选项 - 删除字符串中既不是数字也不是点的部分:

SQL> with test (col) as
  2    (select 'PSU 12.1.0.2.170117' from dual union all
  3     select 'PSU SOMTHING SOMTHING 12.1.0.2.170117 AND HERE SOME' from dual
  4    )
  5  select regexp_replace(col, '[^[:digit:].]')
  6  from test;

REGEXP_REPLACE(COL,'[^[:DIGIT:].]')
---------------------------------------------------
12.1.0.2.170117
12.1.0.2.170117

SQL>

这是使用 REGEXP_REPLACE 和 捕获组:

SELECT
    REGEXP_REPLACE('PSU 12.1.0.2.170117', '^.*?([0-9.]+).*$', '')
FROM dual;

上述方法是分离和捕获任意数量的点或数字。