2009-09-03 44 views
1

在Oracle數據庫10,我做了一個小測試:甲骨文正則表達式 - 編碼問題

SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0, 'i') FROM dual; 

這似乎並不匹配的正則表達式。然而,當我刪除最後一個參數(不區分大小寫的正則表達式參數),正則表達式匹配:

SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0) FROM dual; 

下面的查詢也返回「DONE」

SELECT REGEXP_REPLACE('IF', '[Iİ]F', 'DONE', 1, 0) FROM dual; 
SELECT REGEXP_REPLACE('iF', '[Iİ]F', 'DONE', 1, 0, 'i') FROM dual; 

字符集的數據庫是UTF8

我該怎麼做才能使這個正則表達式工作?

PS:在土耳其語中,字符的大寫版本「我」「我」

回答

2

您可以使用Equivalence Class[[=i=]]

SQL> select regexp_replace('İF', '[[=i=]]f', 'DONE', 1, 0, 'i') from dual; 

REGEXP_REPLACE('İF','[[=I=]]F' 
------------------------------ 
DONE 

SQL> select regexp_replace('if', '[[=i=]]f', 'DONE', 1, 0, 'i') from dual; 

REGEXP_REPLACE('IF','[[=I=]]F' 
------------------------------ 
DONE 

編輯:似乎是關於ı->Ii->İ

一個解決辦法可能是Oracle的一些版本,以與REGEXP搜索功能的一個錯誤使用NLS_UPPERNLS_LOWER功能可以正確使用NLS_SORT設置:

SQL> alter session set nls_sort=XTURKISH; 

Session altered 

SQL> select regexp_replace(NLS_UPPER('İF'), 'İF', 'DONE', 1, 0) from dual; 

REGEXP_REPLACE(NLS_UPPER('İF' 
------------------------------ 
DONE 

SQL> select regexp_replace(NLS_UPPER('if'), 'İF', 'DONE', 1, 0) from dual; 

REGEXP_REPLACE(NLS_UPPER('IF') 
------------------------------ 
DONE