【问题标题】:REGEXP_SUBSTR get second matchREGEXP_SUBSTR 获得第二场比赛
【发布时间】:2015-03-11 04:50:16
【问题描述】:

我有这个字符串:

"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

所以给定字符串的任何输出,我想通过出现得到 3 长度 String :

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

乔德

美元

【问题讨论】:

  • 为您的正则表达式获取第二个匹配项没有多大意义 - 您的正则表达式包含一个 $ 锚点,它仅在字符串的末尾匹配。您的意思是改用USD 吗?
  • 是的!我怎样才能得到美元呢?

标签: sql regex oracle11g regexp-substr


【解决方案1】:

要让您的模式第二次出现,您应该将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 个字母的组)

【讨论】:

  • 嗨!感谢您的评论。但我希望我的正则表达式是动态的?你能想出一个没有硬编码字符串的正则表达式来搜索吗??
  • 对不起,我没有完全得到你想要的。您想要由非字母字符包围的所有长度为 3 的字母组吗?
  • 是的..您可以通过出现获得第一场比赛/第二场比赛
  • 不客气。如果这解决了您的问题,请考虑将我的答案标记为已接受(通过单击检查按钮)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 2020-11-11
  • 2022-11-23
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多