加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle正则表达式_小结

发布时间:2020-12-12 14:31:56 所属栏目:百科 来源:网络整理
导读:oracle 中的支持正则表达式的函数主要有下面四个: 1 , REGEXP_LIKE :与 LIKE 的功能相似 2 , REGEXP_INSTR :与 INSTR 的功能相似 3 , REGEXP_SUBSTR :与 SUBSTR 的功能相似 4 , REGEXP_REPLACE :与 REPLACE 的功能相似 regexp_like 只能用于条件表

oracle中的支持正则表达式的函数主要有下面四个:


1
REGEXP_LIKE:与LIKE的功能相似

2REGEXP_INSTR:与INSTR的功能相似

3REGEXP_SUBSTR:与SUBSTR的功能相似

4REGEXP_REPLACE:与REPLACE的功能相似

regexp_like 只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配,语法很简单:

regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,语法如下:

上面这个模式参数就复杂了些 常用组合以下

regexp_substr(string,pattern,position)

regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:

http://www.weste.net/uploadfile/2010/0918/20100918104143534.gif

regexp_instr(string,pattern)

regexp_replace 函数,和 replace 类似,用于替换符合正则表达式的字符串,语法如下:

http://www.weste.net/uploadfile/2010/0918/20100918104144147.gif

这里解析一下几个参数的含义:

1。source_char,输入的字符串,可以是列名或者字符串常量、变量。

2。pattern,正则表达式。

3。match_parameter,匹配选项取值范围: i:大小写不敏感; c:大小写敏感;n:点号 . 不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。

4。position,标识从第几个字符开始正则表达式匹配。

5。occurrence,标识第几个匹配组。

6。replace_string,替换的字符串。

在新的函数中使用正则表达式来代替通配符‘%’和‘_’。

正则表达式由标准的元字符(metacharacters)所构成:

'^'匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。

$'匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配'n''r'

.匹配除换行符n之外的任何单字符。

?匹配前面的子表达式零次或一次。

+匹配前面的子表达式一次或多次。

*匹配前面的子表达式零次或多次。

'|'指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。

'( )'标记一个子表达式的开始和结束位置。

'[]'标记一个中括号表达式。

'{m,n}'一个精确地出现次数范围,m=<出现次数<=n'{m}'表示出现m次,表示至少出现m次。

num匹配,其中num是一个正整数。对所获取的匹配的引用。

字符簇:

[[:alpha:]]任何字母。

[[:digit:]]任何数字。

[[:alnum:]]任何字母和数字。

[[:space:]]任何白字符。

[[:upper:]]任何大写字母。

[[:lower:]]任何小写字母。

[[:punct:]]任何标点符号。

[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]各种操作符的运算优先级

转义符

(),(?:),(?=),[]圆括号和方括号

*,+,?,{n},{n,},m}限定符

^,$,anymetacharacter位置和顺序

| “操作


说了一堆文绉绉的,现在开始实例演练了,在此之前先建好一个表。

createtabletmpas
withdataas(
select'like'asid,'a9999'asstrfromdualunionall
select'like','a9c'fromdualunionall
select'like','A7007'fromdualunionall
select'like','123a34cc'fromdualunionall
select'substr','123,234,345'fromdualunionall
select'substr','12,34.56:78'fromdualunionall
select'substr','123456789'fromdualunionall
select'instr','192.168.0.1'fromdualunionall
select'replace','(020)12345678'fromdualunionall
select'replace','001517729C28'fromdual
)
select*fromdata;
select*fromtmp;
IDSTR
--------------------
likea9999
likea9c
likeA7007
like123a34cc
substr123,345
substr12,34.56:78
substr123456789
instr192.168.0.1
replace(020)12345678
replace001517729C28

regexp_like 例子:

selectstrfromtmpwhereid='like'andregexp_like(str,'Ad+','i');--'i'忽略大小写
STR
-------------
a9999
a9c
A7007
123a34cc
selectstrfromtmpwhereid='like'andregexp_like(str,'ad+');
STR
-------------
a9999
a9c
123a34cc
selectstrfromtmpwhereid='like'andregexp_like(str,'^ad+');
STR
-------------
a9999
a9c
selectstrfromtmpwhereid='like'andregexp_like(str,'^ad+c$');
STR
-------------
a9999


regexp_substr 例子:

colstrformata15;
select
str,regexp_substr(str,'[^,]+')str,]+',1,1)str,2)str,--occurrence第几个匹配组
regexp_substr(str,2,1)str--position从第几个字符开始匹配
fromtmp
whereid='substr';
STRSTRSTRSTRSTR
---------------------------------------------------------------------------
123,34512312323423
12,34.56:78121234.56:782
12345678912345678912345678923456789

select
str,'d')str,'d+','d{2}','d{3}',1)str
fromtmp
whereid='substr';
STRSTRSTRSTRSTR
---------------------------------------------------------------------------
123,345112323234
12,34.56:7811234
123456789112345678934234


selectregexp_substr('123456789','d',level)str--取出每位数字,有时这也是行转列的方式
fromdual
connectbylevel<=9
STR
---------------
1
2
3
4
5
6
7
8
9

regex_instr 例子:


colindformat9999;
select
str,regexp_instr(str,'.')ind,'.',2)ind,5,2)ind
fromtmpwhereid='instr';
STRINDINDIND
------------------------------
192.168.0.14810

select
regexp_instr('192.168.0.1',level)ind,--点号.所在的位置
regexp_instr('192.168.0.1',level)ind--每个数字的位置
fromdual
connectbylevel<=9
INDIND
----------
41
82
103
05
06
07
09
011
00

regex_replace 例子:

select
str,regexp_replace(str,'020','GZ')str,'(d{3})(d{3})','<21>')str--将第一、第二捕获组交换位置,用尖括号标识出来
fromtmp
whereid='replace';
STRSTRSTR
---------------------------------------------
(020)12345678(GZ)12345678(020)<456123>78
001517729C28001517729C28<517001>729C28

综合应用的例子:

colrow_lineformata30;
withsudokuas(
select'020000080568179234090000010030040050040205090070080040050000060289634175010000020'asline
fromdual
),tmpas(
selectregexp_substr(line,'d{9}',level)row_line,levelcol
fromsudoku
connectbylevel<=9
)
selectregexp_replace(row_line,'(d)(d)(d)(d)(d)(d)(d)(d)(d)','123456789')row_line
fromtmp

ROW_LINE
------------------------------
020000080
568179234
090000010
030040050
040205090
070080040
050000060
289634175
010000020

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读