在Oracle 10数据库中,我做了一个小测试:
SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0, 'i') FROM dual;
这似乎与正则表达式不匹配。但是,当我删除最后一个参数(不区分大小写的regex参数)时,正则表达式匹配:
SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0) FROM dual;
以下查询也会返回“完成”:
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:在土耳其语中,字符“i”的大写版本为“İ”。
答案 0 :(得分: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
修改:某些版本的Oracle似乎存在关于ı->I
和i->İ
一种可行的解决方法是使用NLS_UPPER
或NLS_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