REGEXP_SUBSTR获得第二场比赛

时间:2015-01-13 09:21:29

标签: sql regex oracle11g 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的任何输出,我想通过出现得到3长字符串:

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

JOD

     

USD

1 个答案:

答案 0 :(得分:0)

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

提取匹配的相关部分

(您也可以使用负向前瞻/后视来确保您拥有正好3个字母的组合)