Попытка извлечь числовые из текстового поля - PullRequest
1 голос
/ 10 июня 2019

У меня есть поле с другим текстом, введенным с 13 или 17-значным ID. Нужно извлечь этот идентификатор из этого поля

 regexp_substr(TXT,'CTRL ACDV\\s+(\\d+)',1,1,'ie')..

Txt может быть таким

 SUPPRESSED AND FORWARDING CTRL{ACDV 36608732875895776 } {DRID 12345

   SUPPRESSED AND FORWARDING CTRL 9809770899005 TO FRAUD DUE TO ID TH

   SUPPRESSED AND FORWARDING CTRL ACDV 987878829039161097 .DRID 87569
regexp_substr(TXT,'CTRL ACDV\\s+(\\d+)',1,1,'ie')..

нужно получить

36608732875895776
9809770899005 
987878829039161097

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Вы можете использовать группу захвата и использовать (из документов ) e parameter to return only the part of the string that matches the first sub-expression in the pattern.

Обратите внимание, что последнее число состоит из 18 цифр вместо 17.

\bCTRL\D+(\d{13,18})

Пояснение

  • \bCTRL Соответствует границе слова и CTRL
  • \D+ Соответствует 1+ раз, а не цифре
  • (\d{13,18}) Захват 1 группы 1 соответствует 13 - 18 цифрам

Regex demo

Другой вариант - сопоставить 13 или более цифр с помощью \d{13,}

В документах указано, что шаблоны неявно закреплены на обоих концах, в этом случае вы можете использовать:

.*\bCTRL\D+(\d{13,18})\b.*

Regex demo

0 голосов
/ 10 июня 2019

Если единственными большими числами являются идентификаторы, то это самое короткое и быстрое:

\d{13,17}

Проверьте это здесь .


Имейте в виду, что третий идентификатор (987878829039161097) на самом деле имеет длину 18 цифр.

Поэтому, если минимальная длина составляет 13, вы можете использовать:

\d{13,}

В качестве альтернативы, если вы хотите удалить все, кроме длинных идентификаторов, вы можете найти регулярное выражение:

([^\d]+|\d{,12})

и замените его на \ n (= новая строка) или что угодно (например, пробел).

Проверьте это здесь .

Вы можете получить лучший результат, если сделаете замену в два этапа. Первый для:

[^\d]+

(для не цифр)

и затем для:

\s\d{1,12}(\s|$)

(для чисел менее 13 цифр)

...