Oracle正则表达式_小结

前端之家收集整理的这篇文章主要介绍了Oracle正则表达式_小结前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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,'A\d+','i');--'i'忽略大小写
STR
-------------
a9999
a9c
A7007
123a34cc
selectstrfromtmpwhereid='like'andregexp_like(str,'a\d+');
STR
-------------
a9999
a9c
123a34cc
selectstrfromtmpwhereid='like'andregexp_like(str,'^a\d+');
STR
-------------
a9999
a9c
selectstrfromtmpwhereid='like'andregexp_like(str,'^a\d+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})','<\2\1>')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)','\1\2\3\4\5\6\7\8\9')row_line
fromtmp

ROW_LINE
------------------------------
020000080
568179234
090000010
030040050
040205090
070080040
050000060
289634175
010000020
原文链接:https://www.f2er.com/oracle/207916.html

猜你在找的Oracle相关文章