oracle的正则表达式
发布时间:2025-05-23 14:54:59 发布人:远客网络
一、oracle的正则表达式
Oracle使用正则表达式离不开这4个函数:
4、regexp_replaceregexp_like只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr函数,和substr类似,用于拾取合符正则表达式描述的字符子串,语法如下:regexp_instr函数,和instr类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:regexp_replace函数,和replace类似,用于替换符合正则表达式的字符串,语法如下:解析一下几个参数的含义:
1、source_char,输入的字符串,可以是列名或者字符串常量、变量。
3、match_parameter,匹配选项。取值范围:i:大小写不敏感;c:大小写敏感;n:点号.不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。
4、position,标识从第几个字符开始正则表达式匹配。
5、occurrence,标识第几个匹配组。
6、replace_string,替换的字符串。
二、oracle 正则表达式=
Oracle使用正则表达式离不开这4个函数:
regexp_like只能用于条件表达式,和 like类似,但是使用的正则表达式进行匹配,语法如下:
regexp_substr函数,和 substr类似,用于拾取合符正则表达式描述的字符子串,语法如下:
regexp_instr函数,和 instr类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:
regexp_replace函数,和 replace类似,用于替换符合正则表达式的字符串,语法如下:
1、source_char,输入的字符串,可以是列名或者字符串常量、变量。
3、match_parameter,匹配选项。
取值范围: i:大小写不敏感; c:大小写敏感;n:点号.不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。
4、position,标识从第几个字符开始正则表达式匹配。
5、occurrence,标识第几个匹配组。
6、replace_string,替换的字符串。
三、ORACLE中怎样用正则表达式过滤中文字符
从表里提取汉字,需要考虑字符集,不同的字符集汉字的编码有所不同
这里以GB2312为例,写一函数准确地从表里提取简体汉字.
假设数据库字符集编码是GB2312,环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的
那么也就是汉字是双字节的,且简体汉字的编码范围是
我们先看一下asciistr函数的定义
Non-ASCII characters are converted to the form\xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以"\"开始的字符就是汉字了
这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;
------------------------------------------
,啊OO10哈,\554AOO10\54C8
大家好aa/\5927\5BB6\597Daa/
☆大海123\2606\5927\6D77123
我们看到最后一条记录的实心五角星也是"\"开头的
此时我们就不能用asciistr(字段)是否存在"\"来判断是否含有汉字了.
我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内
create or replace function get_chinese(p_name in varchar2) return varchar2
v_code varchar2(30000):='';
v_chinese varchar2(4000):='';
select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:','') into v_code from dual where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma:= instrb(v_code,',');
v_code_q:= to_number(substrb(v_code,1,v_comma-1));
v_code_w:= to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese:= v_chinese||substr(p_name,i,1);
v_code:= ltrim(v_code,'1234567890');
v_code:= ltrim(v_code,',');
v_code:= ltrim(v_code,'1234567890');
v_code:= ltrim(v_code,',');
SQL> select name from test where length(get_chinese(name))>0;
2.列出有汉字的记录,并且只列出汉字
SQL> select get_chinese(name) from test where length(get_chinese(name))>0;
---------------------------------------------------------------------------
需要说明的是GB2312共有6763个汉字,即72*94-5=6763
我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去
改写这个函数,可以提取非汉字或者汉字
该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字
create or replace function get_chinese
v_code varchar2(30000):='';
v_chinese varchar2(4000):='';
v_non_chinese varchar2(4000):='';
select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:','') into v_code from dual where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma:= instrb(v_code,',');
v_code_q:= to_number(substrb(v_code,1,v_comma-1));
v_code_w:= to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese:= v_chinese||substr(p_name,i,1);
v_non_chinese:= v_non_chinese||substr(p_name,i,1);
v_code:= ltrim(v_code,'1234567890');
v_code:= ltrim(v_code,',');
v_non_chinese:= v_non_chinese||substr(p_name,i,1);
v_code:= ltrim(v_code,'1234567890');
v_code:= ltrim(v_code,',');
if p_chinese='1' then
SQL> select get_chinese(name,1) from a;
-----------------------------------------
SQL> select get_chinese(name,0) from a;
-----------------------------------------