2014-11-06 67 views
0

我需要一個表達,將提供在第一場比賽的獨家匹配它得到,我不知道這是否可以與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的限制。

+0

你的描述不是很清楚。爲什麼Ichabod的「Ichabod Crane」和Crane的「Crane Ichabod」?它是基於首次出現的關鍵字嗎? – nhahtdh 2014-11-07 02:07:47

+0

是,首次出現關鍵字。 Kevin Kirkpatrick的回答應該適合我。 – Thursty 2014-11-07 16:28:59

回答

0

我不會把那種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。

+0

我認爲這會起作用。謝謝。 – Thursty 2014-11-07 16:26:29