Chcę uzyskać 12.1.0.2.170117 z PSU 12.1.0.2.170117. Wzór ([\d|\.]+) wydaje się działać dobrze: https://regex101.com/r/bdcf0w/ 1.

Jednak nie działa zgodnie z oczekiwaniami w REGEXP_REP_REP_REPTURE: http://sqlfiddle.com/#! 4 / 53D64E / 77. Czy tęsknię za czymś? Dlaczego również powraca PSU, kiedy mam tylko \d i \. W moim wyrazie?

Mój tekst może być równie dobrze PSU SOMTHING SOMTHING 12.1.0.2.170117 AND HERE SOME. Moim ostatecznym celem jest również przeczytanie pierwszych 3 kropek.

3
stee1rat 22 luty 2019, 09:52

2 odpowiedzi

Najlepsza odpowiedź

Oto jeden sposób, aby to zrobić za pomocą REGEXP_REPLACE Grupa wychwytywania:

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

Podejście powyżej jest izolowanie i uchwycenie dowolnej ilości kropek lub liczb.

4
Tim Biegeleisen 22 luty 2019, 07:23

Co powiesz na te dwie opcje:

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>

[edytuj]

Cóż, powinieneś tak powiedzieć. Oto kolejna opcja - Usuń części łańcucha, które nie są numery ani kropek:

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>
4
Littlefoot 22 luty 2019, 07:12