使用Oracle的REGEXP_LIKE我需要一个独立的或匹配
我需要一个表达,将提供在第一场比赛的独家匹配它得到,我不知道这是否可以与Oracle的REGEXP_LIKE或不能这样做:使用Oracle的REGEXP_LIKE我需要一个独立的或匹配
假设我有一个字符串“some stuff Ichabod somestuff Crane somestuff”,我希望它匹配Ichabod而不是Crane,但是我想要一个匹配“Crane”但不匹配Ichabod的表达式。同时,如果我有需要匹配Ichabod搜索模式的“Ichabod”,并且“起重机”必须匹配“起重机”模式。实际上,我试图对一串字符串进行分类,“Ichabod Crane”属于Ichabod类别,“Crane Ichabod”属于Crane类别。顺便说一句,我试过类似(?Ichabod)这似乎工作,但(?!Ichabod)或(?!anypattern)从来没有匹配任何东西;似乎是Oracle的regexp_like的限制。
我不会把那种IF-THEN-ELSE逻辑压缩到一个REGEXP函数中。相反,我会使用不同的REGEXP_INSTR每个模式,然后使用CASE逻辑返回的REGEXP_SUBSTR取其形状中最低非零REGEXP_INSTR指数:
select str,
case
when regexp_instr(str,'b') = 0
then regexp_substr(str,'f')
when regexp_instr(str,'f') = 0
then regexp_substr(str,'b')
when regexp_instr(str,'b') = least(regexp_instr(str,'b'),regexp_instr(str,'f'))
then regexp_substr(str,'b')
else regexp_substr(str,'f')
end matched_substr
from (select 'abcdefg' str from dual union all
select 'afcdebg' str from dual union all
select 'abcdeg' str from dual union all
select 'acdefg' str from dual union all
select 'acdeg' str from dual);
╔═════════╦════════════════╗
║ STR ║ MATCHED_SUBSTR ║
╠═════════╬════════════════╣
║ abcdefg ║ b ║
║ afcdebg ║ f ║
║ abcdeg ║ b ║
║ acdefg ║ f ║
║ acdeg ║ ║
╚═════════╩════════════════╝
当然,如果你只希望使用REGEXP为了实现“取得先到者”,并且你的实际模式匹配是简单的字符串匹配,你需要用简单的INSTR和SUBSTR替换REGEXP_INSTR和REGEXP_SUBSTR。
我认为这会起作用。谢谢。 – Thursty 2014-11-07 16:26:29
你的描述不是很清楚。为什么Ichabod的“Ichabod Crane”和Crane的“Crane Ichabod”?它是基于首次出现的关键字吗? – nhahtdh 2014-11-07 02:07:47
是,首次出现关键字。 Kevin Kirkpatrick的回答应该适合我。 – Thursty 2014-11-07 16:28:59