REGEXP_SUBSTR получить второе совпадение

У меня есть эта строка:

"Y::_~XXXXXX XXXXXX~MIGRATION~_~_~_~_~0~JOD50.000~USD257.43::JOD"

Я хотел получить список валют через Regex.

Пока я могу получить только первое совпадение, используя этот запрос:

SELECT 
REGEXP_SUBSTR('Y::_~XXXXXX XXXXXX~MIGRATION~_~_~_~_~0~JOD50.000~USD257.43::JOD','[a-zA-z]{3}$') 
from dual;

Не могли бы вы помочь мне получить второе совпадение в долларах США ?? Спасибо. :D

Кстати, я планирую использовать Regex динамически.

Итак, учитывая любой вывод String, я хотел получить String 3 длины: либо по вхождению

"Y::_~XXXXXX XXXXXX~MIGRATION~_~_~_~_~0~JOD50.000~USD257.43::JOD"

йод

доллар США


person Anonimus    schedule 13.01.2015    source источник
comment
Получение второго совпадения для вашего регулярного выражения не имеет особого смысла — ваше регулярное выражение содержит привязку $, которая соответствует только в конце строки. Вы хотели вместо этого использовать USD?   -  person Frank Schmitt    schedule 13.01.2015
comment
Да! Как я могу вместо этого получить доллары США?   -  person Anonimus    schedule 13.01.2015


Ответы (1)


Чтобы получить второе вхождение вашего шаблона, вы должны установить параметр occurrence для REGEXP_SUBSTR равным 2:

SELECT REGEXP_SUBSTR('Dummy text 123USD another dummy text 456USD', 
  '[0-9]{3}USD',
  1,
  2) from dual

ОБНОВЛЕНИЕ

Чтобы получить все группы из 3 букв, окруженных небуквами, вы можете использовать этот запрос:

select match, substr(match, 2, 3) from (
SELECT 
  REGEXP_SUBSTR('Y::_~XXXXXX XXXXXX~MIGRATION~_~_~_~_~0~JOD50.000~USD257.43::JOD',
  '(^|[^a-zA-Z])[a-zA-z]{3}([^a-zA-Z]|$)',
  1,
  level) as match
from dual
connect by level <= 100
) where match is not null

Это соответствует всем группам из 3 букв [a-zA-Z]{3}, которые либо встречаются в начале строки ^, либо имеют небуквенный символ перед [^a-zA-Z] - and either occur at the end of the string$or have a non-letter character afterwards[^a-zA-Z] - использует CONNECT BY для генерации первых 100 чисел с использованием псевдостолбца LEVEL - передает уровень в качестве параметра вхождения в REGEXP_SUBSTR - исключает все недопустимые совпадения с WHERE MATCH IS NOT NULL - извлекает соответствующую часть совпадения с SUBSTR

(вы также можете использовать отрицательный просмотр вперед/обратный просмотр, чтобы убедиться, что у вас есть группы ровно из 3 букв, конечно)

person Frank Schmitt    schedule 13.01.2015
comment
Привет! Спасибо за комментарий. Но я бы хотел, чтобы мое регулярное выражение было динамическим? Можете ли вы придумать регулярное выражение без жестко запрограммированной строки для поиска ?? - person Anonimus; 13.01.2015
comment
Извините, я не совсем понимаю, что вы хотите. Вы хотите, чтобы все группы букв длиной 3 были окружены неалфавитными символами? - person Frank Schmitt; 13.01.2015
comment
Да .. Либо вы можете получить первое совпадение/второе совпадение по совпадению - person Anonimus; 13.01.2015
comment
Пожалуйста. Если это решило вашу проблему, рассмотрите возможность пометить мой ответ как принятый (нажав кнопку проверки). - person Frank Schmitt; 13.01.2015