如何只在oracle中过滤中文(特殊字符集)?

时间:2016-07-20 09:23:14

标签: sql regex oracle

数据来源:

测试demo
demo1
中文2

输出:

demo
demo1
2

我尝试select regexp_replace('测试中文demo','[\u0391-\uFFE5]','') from dual,但没有效果。并且\w包括中文,因此请勿使用[^\w]

现在我可以想到select regexp_replace('测试中文demo','[^a-zA-Z0-9\s]','') from dual

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

请参阅Searching Unicode characters in Oracle table

  

通常使用正则表达式,您可以使用\x\u后跟十六进制代码来搜索任何字符。例如。 \x20将匹配空格。但是Oracle中的REGEXP_LIKE不支持\x。您需要使用unistr function将代码转换为等效字符,然后将其与REGEXP_LIKE一起使用。例如。 REGEXP_LIKE(source,'[' ||unistr('\0020')|| ']');

所以,你需要像

这样的东西
select regexp_replace('测试中文demo', '[' || unistr('\0391') || '-' || unistr('\9FA5') || ']','') from dual

注意:更好的中文正则表达式应包括以下所有范围:

---------------------------------------------------------------------------------- 
|Block                                   | ES6 Range   |   ES5 Range              |
|---------------------------------------------------------------------------------|
|CJK Unified Ideographs                  | 4E00-9FFF   | \u4E00-\u9FFF            |
|CJK Unified Ideographs Extension A      | 3400-4DFF   | \u3400-\u4DFF            |
|CJK Unified Ideographs Extension B      | 20000-2A6DF | \uD840\uDC00-\uD869\uDEDF|
|CJK Unified Ideographs Extension C      | 2A700–2B73F | \uD869\uDF00-\uD86D\uDF3F|
|CJK Unified Ideographs Extension D      | 2B740–2B81F | \uD86D\uDF40-\uD86E\uDC1F|
|CJK Unified Ideographs Extension E      | 2B820–2CEAF | \uD86E\uDC20-\uD873\uDEAF|
|CJK Compatibility Ideographs            | F900-FAFF   | \uF900-\uFAFF            |
|CJK Compatibility Ideographs Supplement | 2F800-2FA1F | \uD87E\uDC00-\uD87E\uDE1F|
----------------------------------------------------------------------------------

所以,试试

select regexp_replace('测试中文demo','[' || unistr('\4E00') || '-' || unistr('\9FFF') || unistr('\3400') || '-' || unistr('\4DFF') || unistr('\D840\DC00') || '-' || unistr('\D869\DEDF') || unistr('\D869\DF00') || '-' || unistr('\D86D\DF3F') || unistr('\D86D\DF40') || '-' || unistr('\D86E\DC1F') || unistr('\D86E\DC20') || '-' || unistr('\D873\DEAF') || unistr('\F900') || '-' || unistr('\FAFF') || unistr('\D87E\DC00') || '-' || unistr('\D87E\DE1F') || ']','') from dual

答案 1 :(得分:0)

使用REGEXP_REPLACE

SELECT REGEXP_REPLACE(YOURFIELD,'[^a-zA-Z'']','') AS outputfield
FROM YOURTABLE