在 Oracle 中使用正则表达式
来源:互联网 发布:在电脑上看小说的软件 编辑:程序博客网 时间:2024/06/05 05:52
转自:http://www.cnblogs.com/killkill/archive/2010/09/06/1819536.html
Oracle使用正则表达式离不开这4个函数:
1。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
dual
union
all
04
select
'like'
,
'a9c'
from
dual
union
all
05
select
'like'
,
'A7007'
from
dual
union
all
06
select
'like'
,
'123a34cc'
from
dual
union
all
07
select
'substr'
,
'123,234,345'
from
dual
union
all
08
select
'substr'
,
'12,34.56:78'
from
dual
union
all
09
select
'substr'
,
'123456789'
from
dual
union
all
10
select
'instr'
,
'192.168.0.1'
from
dual
union
all
11
select
'replace'
,
'(020)12345678'
from
dual
union
all
12
select
'replace'
,
'001517729C28'
from
dual
13
)
14
select
*
from
data ;
15
16
select
*
from
tmp ;
17
ID STR
18
------- -------------
19
like
a9999
20
like
a9c
21
like
A7007
22
like
123a34cc
23
substr 123,234,345
24
substr 12,34.56:78
25
substr 123456789
26
instr 192.168.0.1
27
replace
(020)12345678
28
replace
001517729C28
regexp_like 例子:
01
select
str
from
tmp
where
id=
'like'
and
regexp_like(str,
'A\d+'
,
'i'
);
-- 'i' 忽略大小写
02
STR
03
-------------
04
a9999
05
a9c
06
A7007
07
123a34cc
08
09
select
str
from
tmp
where
id=
'like'
and
regexp_like(str,
'a\d+'
);
10
STR
11
-------------
12
a9999
13
a9c
14
123a34cc
15
16
select
str
from
tmp
where
id=
'like'
and
regexp_like(str,
'^a\d+'
);
17
STR
18
-------------
19
a9999
20
a9c
21
22
select
str
from
tmp
where
id=
'like'
and
regexp_like(str,
'^a\d+$'
);
23
STR
24
-------------
25
a9999
regexp_substr 例子:
01
col str format a15;
02
select
03
str,
04
regexp_substr(str,
'[^,]+'
) str,
05
regexp_substr(str,
'[^,]+'
,1,1) str,
06
regexp_substr(str,
'[^,]+'
,1,2) str,
-- occurrence 第几个匹配组
07
regexp_substr(str,
'[^,]+'
,2,1) str
-- position 从第几个字符开始匹配
08
from
tmp
09
where
id=
'substr'
;
10
STR STR STR STR STR
11
--------------- --------------- --------------- --------------- ---------------
12
123,234,345 123 123 234 23
13
12,34.56:78 12 12 34.56:78 2
14
123456789 123456789 123456789 23456789
15
16
select
17
str,
18
regexp_substr(str,
'\d'
) str,
19
regexp_substr(str,
'\d+'
,1,1) str,
20
regexp_substr(str,
'\d{2}'
,1,2) str,
21
regexp_substr(str,
'\d{3}'
,2,1) str
22
from
tmp
23
where
id=
'substr'
;
24
STR STR STR STR STR
25
--------------- --------------- --------------- --------------- ---------------
26
123,234,345 1 123 23 234
27
12,34.56:78 1 12 34
28
123456789 1 123456789 34 234
29
30
31
select
regexp_substr(
'123456789'
,
'\d'
,1,
level
) str
--取出每位数字,有时这也是行转列的方式
32
from
dual
33
connect
by
level
<=9
34
STR
35
---------------
36
1
37
2
38
3
39
4
40
5
41
6
42
7
43
8
44
9
regex_instr 例子:
01
col ind format 9999;
02
select
03
str,
04
regexp_instr(str,
'\.'
) ind ,
05
regexp_instr(str,
'\.'
,1,2) ind ,
06
regexp_instr(str,
'\.'
,5,2) ind
07
from
tmp
where
id=
'instr'
;
08
STR IND IND IND
09
--------------- ----- ----- -----
10
192.168.0.1 4 8 10
11
12
select
13
regexp_instr(
'192.168.0.1'
,
'\.'
,1,
level
) ind ,
-- 点号. 所在的位置
14
regexp_instr(
'192.168.0.1'
,
'\d'
,1,
level
) ind
-- 每个数字的位置
15
from
dual
16
connect
by
level
<= 9
17
IND IND
18
----- -----
19
4 1
20
8 2
21
10 3
22
0 5
23
0 6
24
0 7
25
0 9
26
0 11
27
0 0
regex_replace 例子:
01
select
02
str,
03
regexp_replace(str,
'020'
,
'GZ'
) str,
04
regexp_replace(str,
'(\d{3})(\d{3})'
,
'<\2\1>'
) str
-- 将第一、第二捕获组交换位置,用尖括号标识出来
05
from
tmp
06
where
id=
'replace'
;
07
STR STR STR
08
--------------- --------------- ---------------
09
(020)12345678 (GZ)12345678 (020)<456123>78
10
001517729C28 001517729C28 <517001>729C28
综合应用的例子:
01
col row_line format a30;
02
with
sudoku
as
(
03
select
'020000080568179234090000010030040050040205090070080040050000060289634175010000020'
as
line
04
from
dual
05
),
06
tmp
as
(
07
select
regexp_substr(line,
'\d{9}'
,1,
level
) row_line,
08
level
col
09
from
sudoku
10
connect
by
level
<=9
11
)
12
select
regexp_replace( row_line ,
'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)'
,
'\1 \2 \3 \4 \5 \6 \7 \8 \9'
) row_line
13
from
tmp
14
15
ROW_LINE
16
------------------------------
17
0 2 0 0 0 0 0 8 0
18
5 6 8 1 7 9 2 3 4
19
0 9 0 0 0 0 0 1 0
20
0 3 0 0 4 0 0 5 0
21
0 4 0 2 0 5 0 9 0
22
0 7 0 0 8 0 0 4 0
23
0 5 0 0 0 0 0 6 0
24
2 8 9 6 3 4 1 7 5
25
0 1 0 0 0 0 0 2 0
- 在 Oracle 中使用正则表达式[官网]
- 在 Oracle 中使用正则表达式
- 在 Oracle 中使用正则表达式
- oracle 中使用正则表达式
- Oracle 中使用正则表达式
- 在grep中使用正则表达式使用
- oracle plsql中使用正则表达式。
- Oracle中正则表达式使用小记
- 如何在Delphi中使用正则表达式
- 在python 中使用正则表达式
- 如何在 PHP 中使用正则表达式
- 在java中使用正则表达式
- 在JavaScript中使用正则表达式
- 在Delphi程序中使用正则表达式
- 如何在Delphi中使用正则表达式
- 在UltraEdit中使用正则表达式
- 在ACCESS中如何使用正则表达式
- 在c语言中使用正则表达式
- 新手学Android
- phpmyadmin configure
- static用法小结
- 转载几篇关于jvm的文章
- Linux操作系统RPM与TAR的基本安装和卸载
- 在 Oracle 中使用正则表达式
- STM32 BOOT 引脚配置的说明
- 想成为嵌入式程序员应知道的16个基本问题
- 在Android中调用图片、视频、音频、录音、拍照
- Linux下FTP服务器的安装(proftpd)
- symbian 调试集锦
- [C/C++] new的几种用法
- axis2 调用案例
- 路由器与交换机的区别 深入分析