首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只过滤甲骨文中的中文(特殊字符集)?

如何只过滤甲骨文中的中文(特殊字符集)?
EN

Stack Overflow用户
提问于 2016-07-20 09:23:13
回答 2查看 3.4K关注 0票数 1

数据来源:

代码语言:javascript
复制
测试demo
demo1
中文2

产出:

代码语言:javascript
复制
demo
demo1
2

我试着select regexp_replace('测试中文demo','[\u0391-\uFFE5]','') from dual,但没有效果。和\w包括中国人,所以不要使用[^\w]

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

有更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-20 09:51:00

请参阅http://debugguru.blogspot.com/2011/11/searching-unicode-characters-in-oracle.html

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

所以,你需要一些东西

代码语言:javascript
复制
select regexp_replace('测试中文demo', '[' || unistr('\0391') || '-' || unistr('\9FA5') || ']','') from dual

注:一个更好的中文版本应该包括以下所有的范围:

代码语言:javascript
复制
---------------------------------------------------------------------------------- 
|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

票数 5
EN

Stack Overflow用户

发布于 2016-07-20 09:28:21

使用REGEXP_REPLACE

代码语言:javascript
复制
SELECT REGEXP_REPLACE(YOURFIELD,'[^a-zA-Z'']','') AS outputfield
FROM YOURTABLE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38477317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档