REGEXP_SUBSTR 获得第二场比赛

REGEXP_SUBSTR get second match

我有这个 字符串 :

"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 的任何输出,我想通过出现

获得 3-length String :
"Y::_~XXXXXX XXXXXX~MIGRATION~_~_~_~_~0~JOD50.000~USD257.43::JOD"

JOD

USD

要让您的模式第二次出现,您应该将 REGEXP_SUBSTRoccurrence 参数设置为 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 使用 LEVEL 伪列生成前 100 个数字 - 将级别作为发生参数输入 REGEXP_SUBSTR - 排除所有与 WHERE MATCH IS NOT NULL 无效的匹配 - 提取与 SUBSTR

匹配的相关部分

(当然,您也可以使用否定前瞻/后视来确保您有恰好 3 个字母的组)