当前位置:首页 » 编程语言 » oraclesql正则表达式
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oraclesql正则表达式

发布时间: 2022-07-26 09:36:25

① oracle 可以用正则表达式吗

sql">--正则表达式检索REGEXP_LIKE

--测试表

CREATETABLEtest_reg_like(avarchar(20));

INSERTINTOtest_reg_likeVALUES('ABC');
INSERTINTOtest_reg_likeVALUES('A12');
INSERTINTOtest_reg_likeVALUES('12a12');
3个参数
第一个是输入的字符串
第二个是正则表达式
第三个是取值范围:
i:大小写不敏感;
c:大小写敏感;
n:点号.不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。
全部测试数据
SQL>SELECT*FROMtest_reg_like;
A
----------------------------------------
ABC
A12
12a12

匹配字母A的
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'A');
A
----------------------------------------
ABC
A12

匹配字母A的(大小写不敏感)
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'A','i');
A
----------------------------------------
ABC
A12
12a12

匹配字母A后面跟1个或多个数字的(大小写不敏感)
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'Ad+','i');
A
----------------------------------------
A12
12a12

匹配字母A开头,数字结尾的
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'^A.+d$');
A
----------------------------------------
A12

② oracle plsql中字符串(正则表达式):val((3+4)/7)+val(4+5)+10。我想取出val((3+4)/7)这一段应该怎么取

这个可以直接在plsql里面运行,应该是你要的东西,记得给分哦
declare
str varchar2(100) :='val((3+4)/7)+val(4+5)+10';
substr varchar2(100):='';
valuestr varchar2(100):='';
strsql varchar2(100):='select exp from al';
exesql varchar2(100):='';
begin
while(regexp_instr(str,'\(\d+([+-\*/]\d+)*\)')>0)
loop
substr:=regexp_substr(str,'\(\d+([+-\*/]\d+)*\)');
exesql:=replace(strsql,'exp',substr);
execute immediate exesql into valuestr;
str:=replace(str,substr,valuestr);
end loop;
str:=replace(str,'val','');
dbms_output.put_line(str);
end;

③ 怎么在 oracle 存储过程中 使用正则表达式

15:45:11 SQL> select substr('2:1:3',instr('2:1:3',':',2)+1,
15:45:14 2 instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from al;
S
-
1
已用时间: 00: 00: 00.15
15:45:19 SQL> select substr('2:1:3',1,instr('2:1:3',':')-1) from al;
S
-
2
已用时间: 00: 00: 00.15
15:45:36 SQL> select substr('2:1:3',instr('2:1:3',':',2)+1,
15:45:38 2 instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from al;
S
-
1
已用时间: 00: 00: 00.16
15:45:56 SQL> select substr('2:1:3',instr('2:1:3',':',3)+1) from al;
S
-
3
已用时间: 00: 00: 00.16
15:46:02 SQL>

④ 如何在oracle中使用正则表达式

regexp_like 2。regexp_substr 3。regexp_instr 4。regexp_replace 看函数名称大概就能猜到有什么用了。 regexp_like 只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配,语法很简单: regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,语法如下: regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的开始位置,语法如下: regexp_replace 函数,和 replace 类似,用于替换符合正则表达式的字符串,语法如下: 这里解析一下几个参数的含义: 1。source_char,输入的字符串,可以是列名或者字符串常量、变量。 2。pattern,正则表达式。 3。match_parameter,匹配选项。 取值范围: i:大小写不敏感; c:大小写敏感;n:点号 . 不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。 4。position,标识从第几个字符开始正则表达式匹配。 5。occurrence,标识第几个匹配组。 6。replace_string,替换的字符串。 说了一堆文绉绉的,现在开始实例演练了,在此之前先建好一个表。 01 create table tmp as 02 with data as ( 03 select 'like' as id ,'a9999' as str from al union all 04 select 'like' ,'a9c' from al union all 05 select 'like' ,'A7007' from al union all 06 select 'like' ,'123a34cc' from al union all

⑤ Oracle正则表达式

Oracle正则表达式的应用在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr 和regexp_replace。这里在我们oracle 10g里灵活应用。 先来简单介绍一下正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先,行的起始与结束 “^”这个字符是表示只查找行首的内容。“$”这个字符只查找行末的内容。接下来是“^”还可以做为一个排除字符来使用。还是使用例子来做一个演示比较明了一下。 这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多。select * from test_tablewhere regexp_like(field_1,'^1234')这个就是表示是以1234打头的字符串是不是有匹配的。这里和like的方式是一样的。 select * from test_tablewhere regexp_like(field_1,'^[12]234')这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。 select * from test_tablewhere regexp_like(field_1,'^(欧阳|李)小二')这里我们就可以表达,这个查询一个姓是欧阳或李的,名字叫小二的字符串。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。这里还有一个“|”来表示或的意思。 select * from test_tablewhere regexp_like(field_1,'^李[小]*二')这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配。这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。还有一个“?”来说表示1或是0个。 select * from test_tablewhere regexp_like(field_1,'李[^小]二')这里我们可以查询到姓李的,但是第二字不是“小”这个字。 select * from test_tablewhere regexp_like(field_1,'[0-9]')这里是表示我们查询字符串含有0-9的数字的字符串。 select * from test_tablewhere regexp_like(field_1,'[a-z]')这里是表示我们查询字符串含有a-z的小写字母的字符串。 select * from test_tablewhere regexp_like(field_1,'[A-z]')这里是表示我们查询字符串含有A-z的所有字母的字符串。 select * from test_tablewhere regexp_like(name,'[[:alpha:]]')这里是表示查询匹配任意字母,也包括中文字 select * from test_tablewhere regexp_like(name,'[[:alnum:]]')这里是表示查询匹配任意字母和数字 select * from test_tablewhere regexp_like(name,'[[:digit:]]')这里是表示查询匹配任意数字 Select * from test_tableWhere regexp_like(name,’of’,’i’)这里就是of不区分大小写 Select * from test_tableWhere regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)这样我们可以查询是不是ip格式 接下来介绍一下regexp_substr这个也是一个非常实用的一个函数 REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 注: srcstr 源字符串 pattern 正则表达式样式 position 开始匹配字符位置 occurrence 匹配出现次数 match_option 匹配选项(区分大小写) SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM al; Output: 1PSN [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM al; Output: 231 与上面一个例子相比,多了两个参数1 表示从源字符串的第一个字符开始查找匹配2 表示第2次匹配到的字符串(默认值是“1”,如上例) select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from al; Output: 231 @* 表示匹配0个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符注意:需要区别“+”和“*”的区别 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from al; Output: @@+ 表示匹配1个或者多个@ [[:alnum:]]* 表示匹配0个或者多个字母或数字字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from al; Output: /ABc [^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符 select regexp_substr('[email protected]','[^@]+') from al; Output: Tom_Kyte [^@]+ 表示匹配1个或者多个不是“@”的字符 select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from al; Output: Null [[:alnum:]]* 表示匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null” 这里我们有时候会查询字符串里asdfafd<main>dafda 这里我们要取出<main>这个字符串Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from alOutput: <main> 这里我们在<>中间去一个^>这样在匹配<之后,在向后查询的时候确保在匹配到>之前不再在有>,不然的话就要有可以出错的情况。 Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from alOutput: <main>da>在这个例子中,我们在<main>之后还在da>,这样的话,如果我们没有添加^>,正则表达式就会向后继续去匹配,直到最后一个>为至,这样就会出现偏差 这个通常用来实现字符串的列传行select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from alconnect by rownum <= length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1这里length这里操作是先得到有多少个“;”,再通过 connect by rownum方式来做一行成多行的操作,在变成多行之后,可以通过regexp_substr来取字符串的操作 接着上一个例子a,b,c,d,e,d,f,a,n这样的一个字符串,我们现在要把字符串里一些重复去掉,这样的话结果是a,b,c,d,e,f,n去掉了d与a的两个字符串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from alconnect by rownum<=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通过转成多行的,再用distinct 去掉重复,然后我们再通过wm_concat来字符串合并来完成。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5order by rownum) 来一个验证IP是数字是否正确select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5)where new_value>=0 and new_value<256having count(*) =4 来一个IP字符串格式转换成数字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from alconnect by rownum<=4) 接下来介绍一个regexp_instr函数 REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点。REGEXP_INSTR 的语法如下所示。REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置,如果没有发现匹配的值,则返回0。 语法: 2.REGEXP_INSTR与INSTR函数相同,返回字符串位置 REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 与REGEXP_SUBSTR一样,它也有变量pattern、position(开始位置)、occurrence 和match_parameter;这里主要介绍一下新参数return_option 的作用,它允许用户告诉Oracle,模式出现的时候,要返回什么内容。 Select regexp_instr('asdfafd<main>da>fda','sd') from alOutput:2这里去查询sd的位置,这个和instr是在相同的 Select regexp_instr('asdfafd<main>da>fda','da',1,2) from al这里是查询da第二出现的位置 还有我们经常会遇到一种情况是,查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'温州' ,'大城市','小城市') from al只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|温州)'),0,'小城市', '大城市') from al通过regexp_instr不匹配时为0的条件,这样就可以完成了 最后一个函数regexp_replaceREGEXP_REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REGEXP_REPLACE的格式如下所示 语法: 4.REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 这个替换函数还是一个非常好用的。如我们在有一个字符串adfadfa (main) next 现在我们要把()替换成<>,这里我们可能想用replace就可以搞定了,但是我们现在做的是(之后必须有)这样的()我们才替换把<>.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from aloutput: adfadfa <main> next这里还是一个\做为转义字符。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from aloutput: 012.019.168.027这里我分成两步来操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先让每个小字符串做添加0,这样每个字符串都会大于3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')这整个字符串分成8段,这样我们只要2、4、6、8这四个段就可以了。 下面一个例子中,在每两个字符之间插入一个空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM al; Output: Y A H O O这个用一个循环的方式去操作,还蛮很好的。 select regexp_replace(regexp_replace('12.19.168.27','([^.]+)','00\1') ,'([^.]*)([^.]{3})','\2')from al接着刚才那个,我们可以把replace循环替换的方式来操作。

⑥ oracle 正则表达式

select regexp_replace('If IsValid("date", to_date(Trim(LK_01.TX_DATE) Then "19111111" then ','if\s+isvalid.*\((.*?)\).*?then','\1 ',1,0,'i') from al;

这样的话就是得出LK_01.TX_DATE这个结果啦
嘻嘻

⑦ oracle函数中正则表达式 是什么意思

ORACLE 中的支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与 LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR 的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
它们在用法上与Oracle SQL 函数 LIKE、INSTR、SUBSTR 和REPLACE 用法相
同.

⑧ oracle SQL 正则表达式

正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境。
本文主要介绍了关于Oracle中正则表达式的使用方法,下面话不多说了,来一起看看详细的介绍。
Oracle使用正则表达式离不开这4个函数:regexp_like、regexp_substr、regexp_instr、regexp_replace。
1、regexp_like
该函数只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配
2、regexp_substr
该函数和 substr 类似,用于拾取合符正则表达式描述的字符子串
3、regexp_instr
该函数和 instr 类似,用于标定符合正则表达式的字符子串的开始位置
4、regexp_replace
该函数和 replace 类似,用于替换符合正则表达式的字符串

⑨ oracle 的正则表达式

oracle的正则表达式(10g才可以用)

oracle的正则表达式(regular expression)简单介绍
目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境。
Oracle 10g正则表达式提高了SQL灵活性。有效的解决了数据有效性,重复词的辨认, 无关的空白检测,或者分解多个正则组成的字符串等问题。
Oracle 10g支持正则表达式的四个新函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。
它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。
特殊字符:
'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或'\r'。
'.' 匹配除换行符 \n之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'*' 匹配前面的子表达式零次或多次。
'+' 匹配前面的子表达式一次或多次。
'( )' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。
正则表达式的一个很有用的特点是可以保存子表达式以后使用,被称为Backreferencing. 允许复杂的替换能力
如调整一个模式到新的位置或者指示被代替的字符或者单词的位置. 被匹配的子表达式存储在临时缓冲区

中,缓冲区从左到右编号, 通过\数字符号访问。 下面的例子列出了把名字 aa bb cc 变成cc, bb, aa.
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM al;
REGEXP_REPLACE('ELLENHILDISMIT
cc, bb, aa
'\' 转义符。
字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[unct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
各种操作符的运算优先级
\ 转义符
(), (?, (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作
--测试数据
create table test(mc varchar2(60));
insert into test values('112233445566778899');
insert into test values('2344 5566778899');
insert into test values('33112244 5566778899');
insert into test values('44112233 5566 778899');
insert into test values('5511 2233 4466778899');
insert into test values('661122334455778899');
insert into test values('771122334455668899');
insert into test values('881122334455667799');
insert into test values('991122334455667788');
insert into test values('aabbccddee');
insert into test values('bbaaaccddee');
insert into test values('ccabbddee');
insert into test values('ddaabbccee');
insert into test values('eeaabbccdd');
insert into test values('ab123');
insert into test values('123xy');
insert into test values('007ab');
insert into test values('abcxy');
insert into test values('The final test is is is how to find plicate words.');
commit;
一、REGEXP_LIKE
select * from test where regexp_like(mc,'^a{1,3}');
select * from test where regexp_like(mc,'a{1,3}');
select * from test where regexp_like(mc,'^a.*e$');
select * from test where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'[^[:digit:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'^[^[:digit:]]');
二、REGEXP_INSTR
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test;
Select REGEXP_INSTR(mc,'[[:digit:]]+$') from test;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]]+') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;
三、REGEXP_SUBSTR
SELECT REGEXP_SUBSTR(mc,'[a-z]+') FROM test;
SELECT REGEXP_SUBSTR(mc,'[0-9]+') FROM test;
SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;
四、REGEXP_REPLACE
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM al;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM al;