2011-10-27 53 views
3

行,所以我很困惑(顯然)正則表達式完整的單詞匹配

我試圖返回行(甲骨文),其中一個文本字段包含一個完整的字,而不僅僅是子。

一個簡單的例子是單詞'我'。

給我看的字符串包含單詞「我」的所有行,而不是簡單地在那裏「我」是一個串的地方,如'%I%'

所以我寫了什麼,我認爲將是一個簡單的正則表達式:

select REGEXP_INSTR(upper(description), '\bI\b') from mytab; 

預計我應該用字邊界檢測。我沒有得到任何結果(或者說每一行的結果0

我的期望:

  • '我是管理員 - > 1
  • '我是管理員' - > 0。
  • '我是管理員' - > 1
  • '這是臭名昭著的管理員' - > 0
  • '的adminisrtrator,TIS I' - > 1

不是/ b應該通過字邊界找到包含的字符串嗎?

tia

+0

[Oracle REGEXP \ _LIKE和單詞邊界](http:// stackoverflow。com/questions/7567700/oracle-regexp-like-and-word-boundaries) – Dzyann

回答

4

Oracle不支持字邊界錨定,但即使這樣做,也不會得到期望的結果:\b匹配字母數字字符和非字母數字字符。關於alnum的具體定義在不同的實現中有所不同,但是在大多數的版本中,它是[A-Za-z0-9_](.NET也考慮Unicode字母/數字)。

所以在%I%I附近有兩個邊界。

如果你定義字邊界爲「空格前/後字」,那麼你可以使用

(^|\s)I(\s|$) 

這也將在字符串的開始/結束工作。

+2

謝謝。這個變體給了我相當不錯的結果:'(^ | \ W)TO(\ W | $)'\ W是'非單詞'字符... – Randy

+0

但是,這會提取'%I%'。 –

+0

我的意思是%I%作爲您可能在LIKE語句中進行比較的一個示例...對於任何混淆抱歉。 – Randy