您当前的位置:首页 > 互联网教程

oracle的正则表达式

发布时间:2025-05-23 14:54:59    发布人:远客网络

oracle的正则表达式

一、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;

-----------------------------------------