使用Oracle的regexp_like我需要一个独占或匹配

时间:2014-11-06 22:36:14

标签: regex oracle

我需要一个能够在第一场比赛中提供独家匹配的表达式,而且我不知道这是否可以通过Oracle的regexp_like来完成:

假设我有一个字符串"一些东西Ichabod somestuff Crane somestuff",我希望它能匹配Ichabod而不是Crane但是我想要一个能够匹配" Crane"但不是Ichabod。同时,如果我有" Ichabod"需要匹配Ichabod搜索模式和" Crane"必须匹配"起重机"图案。实际上,我试图对一堆字符串进行分类,并且#Ibebod Crane"属于Ichabod类别和#34; Crane Ichabod"属于起重机类别。

顺便说一句,我尝试了类似(?Ichabod)的东西似乎有用,但(?!Ichabod)或(?!anypattern)从不匹配任何东西;似乎是Oracle的regexp_like的限制。

1 个答案:

答案 0 :(得分:0)

我不会将那种IF-THEN-ELSE逻辑压缩到单个REGEXP函数中。相反,我为每个模式使用不同的REGEXP_INSTR,然后使用CASE逻辑返回具有最低非零REGEXP_INSTR索引的模式的REGEXP_SUBSTR:

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来实现"得到第一个",并且您的实际模式匹配是简单的字符串匹配,那么您将要替换REGEXP_INSTR和REGEXP_SUBSTR使用简单的INSTR和SUBSTR。