regexp_replace的困难

问题描述 投票:3回答:2

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

但是,它在Oracle的regexp_replace:http://sqlfiddle.com/#!4/53d64e/77中无法正常工作。我错过了什么吗?当我只有PSU\d时,为什么它也会返回\。在我的表情?

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

regex oracle regexp-replace
2个回答
4
投票

以下是使用带有捕获组的REGEXP_REPLACE执行此操作的一种方法:

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

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


4
投票

这两个选项怎么样:

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>
© www.soinside.com 2019 - 2024. All rights reserved.