Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
[导读]Oracle使用正则表达式离不开这4个函数:
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
04
05
06
07
08
09
10
11
12
13 )
14 select * from data ;
15
16 select * from tmp ;
17ID
18 ------- -------------
19 like
20 like
21 like
22 like
23 substr
24 substr
25 substr
26 instr
27 replace (020)12345678
28 replace 001517729C28
regexp_like 例子:
01 select str from tmp where id='like' andregexp_like(str,'A\d+','i'); -- 'i' 忽略大小写
02 STR
03 -------------
04 a9999
05 a9c
06 A7007
07 123a3
4cc
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' andregexp_like(str,'^a\d+');
17 STR
18 -------------
19 a9999
20 a9c
21
22 select str from tmp where id='like' andregexp_like(str,'^a\d+$');
23 STR
24 -------------
25 a9999
regexp_substr 例子:
01 col str format a15;
02 select
03
04
05
06
07
08 from tmp
09 where id='substr';
10STR
11 --------------- --------------- ------------------------------ ---------------
12123,234,345
1312,34.56:78
14123456789
15
16 select
17
18
19
20
21
22 from tmp
23 where id='substr';
24STR
25 --------------- --------------- ------------------------------ ---------------
26123,234,345
2712,34.56:78
28123456789
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
04
05
06
07 from tmp where id='instr';
08STR
09 --------------- ----- ----- -----
10192.168.0.1
11
12 select
13
14
15 from dual
16 connect by level <=
17
18 ----- -----
19
20
21
22
23
24
25
26
27
regex_replace 例子:
01 select
02
03
04
05 from tmp
06 where id='replace';
07STR
08 --------------- --------------- ---------------
09 (020)12345678
10001517729C28
综合应用的例子:
01 col row_line format a30;
02 with sudoku as (
03
04
05 ),
06 tmp as (
07
08
09
10
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