Сложности с regexp_replace - PullRequest
       7

Сложности с regexp_replace

0 голосов
/ 22 февраля 2019

Я хочу получить 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 точки.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вот один из способов сделать это, используя REGEXP_REPLACE с группой захвата:

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

Вышеописанный подход заключается в выделении и захвате любого количества точек или чисел.

0 голосов
/ 22 февраля 2019

Как насчет этих двух вариантов:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...