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,替换的字符串。
说了一堆文绉绉的,现在开始实例演练了,在此之前先建好一个表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
create table tmp as
with data as (
select 'like' as id , 'a9999' as str from dual union all
select 'like' , 'a9c' from dual union all
select 'like' , 'A7007' from dual union all
select 'like' , '123a34cc' from dual union all
select 'substr' , '123,234,345' from dual union all
select 'substr' , '12,34.56:78' from dual union all
select 'substr' , '123456789' from dual union all
select 'instr' , '192.168.0.1' from dual union all
select 'replace' , '(020)12345678' from dual union all
select 'replace' , '001517729C28' from dual
) select * from data ;
select * from tmp ;
ID STR ------- ------------- like a9999
like a9c
like A7007
like 123a34cc
substr 123,234,345 substr 12,34.56:78 substr 123456789 instr 192.168.0.1 replace (020)12345678
replace 001517729C28
|
regexp_like 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
select str from tmp where id= 'like' and regexp_like(str, 'A\d+' , 'i' ); -- 'i' 忽略大小写
STR ------------- a9999 a9c A7007 123a34cc select str from tmp where id= 'like' and regexp_like(str, 'a\d+' );
STR ------------- a9999 a9c 123a34cc select str from tmp where id= 'like' and regexp_like(str, '^a\d+' );
STR ------------- a9999 a9c select str from tmp where id= 'like' and regexp_like(str, '^a\d+$' );
STR ------------- a9999 |
regexp_substr 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
col str format a15; select str,
regexp_substr(str, '[^,]+' ) str,
regexp_substr(str, '[^,]+' ,1,1) str,
regexp_substr(str, '[^,]+' ,1,2) str, -- occurrence 第几个匹配组
regexp_substr(str, '[^,]+' ,2,1) str -- position 从第几个字符开始匹配
from tmp
where id= 'substr' ;
STR STR STR STR STR --------------- --------------- --------------- --------------- --------------- 123,234,345 123 123 234 23 12,34.56:78 12 12 34.56:78 2 123456789 123456789 123456789 23456789 select str,
regexp_substr(str, '\d' ) str,
regexp_substr(str, '\d+' ,1,1) str,
regexp_substr(str, '\d{2}' ,1,2) str,
regexp_substr(str, '\d{3}' ,2,1) str
from tmp
where id= 'substr' ;
STR STR STR STR STR --------------- --------------- --------------- --------------- --------------- 123,234,345 1 123 23 234 12,34.56:78 1 12 34 123456789 1 123456789 34 234 select regexp_substr( '123456789' , '\d' ,1, level ) str --取出每位数字,有时这也是行转列的方式
from dual
connect by level <=9
STR --------------- 1 2 3 4 5 6 7 8 9 |
regex_instr 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
col ind format 9999; select str,
regexp_instr(str, '\.' ) ind ,
regexp_instr(str, '\.' ,1,2) ind ,
regexp_instr(str, '\.' ,5,2) ind
from tmp where id= 'instr' ;
STR IND IND IND --------------- ----- ----- ----- 192.168.0.1 4 8 10 select regexp_instr( '192.168.0.1' , '\.' ,1, level ) ind , -- 点号. 所在的位置
regexp_instr( '192.168.0.1' , '\d' ,1, level ) ind -- 每个数字的位置
from dual
connect by level <= 9
IND IND
----- ----- 4 1
8 2
10 3
0 5
0 6
0 7
0 9
0 11
0 0
|
regex_replace 例子:
1
2
3
4
5
6
7
8
9
10
|
select str,
regexp_replace(str, '020' , 'GZ' ) str,
regexp_replace(str, '(\d{3})(\d{3})' , '<\2\1>' ) str -- 将第一、第二捕获组交换位置,用尖括号标识出来
from tmp
where id= 'replace' ;
STR STR STR --------------- --------------- --------------- (020)12345678 (GZ)12345678 (020)<456123>78 001517729C28 001517729C28 <517001>729C28 |
综合应用的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
col row_line format a30; with sudoku as (
select '020000080568179234090000010030040050040205090070080040050000060289634175010000020' as line
from dual
), tmp as (
select regexp_substr(line, '\d{9}' ,1, level ) row_line,
level col
from sudoku
connect by level <=9
) 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
from tmp
ROW_LINE ------------------------------ 0 2 0 0 0 0 0 8 0 5 6 8 1 7 9 2 3 4 0 9 0 0 0 0 0 1 0 0 3 0 0 4 0 0 5 0 0 4 0 2 0 5 0 9 0 0 7 0 0 8 0 0 4 0 0 5 0 0 0 0 0 6 0 2 8 9 6 3 4 1 7 5 0 1 0 0 0 0 0 2 0 |
相关推荐
* 元字符和普通字符:元字符是指在正则表达式中表示特殊含义的字符,如"."、"\"、"?"、"*"、"+"、"|",等等。普通字符是指除元字符外的所有 Unicode 字符。 * 量词:量词用来指定量词的前一个字符出现的次数,如"?",...
在 Oracle 数据库中,正则表达式是一种强大的模式匹配工具,可以帮助用户快速搜索、替换和验证数据。从 Oracle 10g 开始,Oracle 内建了符合 IEEE POSIX (Portable Operating System for Unix)标准的正则表达式,...
### Oracle正则表达式详解(用法+实例) #### 一、正则表达式简介 正则表达式是一种用于匹配字符串中字符组合的工具。它由一个或多个字符及特殊的字符元组成,能够帮助我们执行复杂的字符串搜索和替换任务。在...
ORACLE 正则表达式的使用(REGEXP_LIKE REGEXP_INSTR REGEXP_SUBSTR REGEXP_REPLACE)
- **集成到SQL语句中**:可以直接在SQL查询中使用正则表达式进行条件过滤,无需编写额外的程序代码。 ##### 3.2 实现方法 - **REGEXP_LIKE**:用于判断一个字符串是否符合指定的正则表达式模式。 - **REGEXP_INSTR*...
例如,在`WHERE`子句中使用正则表达式可能无法利用索引,导致全表扫描,从而影响查询效率。 ### 结论 ORACLE.PLSQL中的正则表达式功能为数据库操作提供了极大的灵活性和便利性。无论是数据清洗、格式化还是复杂的...
2. **错误排查**:正则表达式中的错误排查通常比标准SQL语句更加困难。开发者需要熟悉正则表达式的语法和特性,以便能够准确地定位和解决问题。 3. **性能考虑**:尽管正则表达式提供了强大的查询能力,但在某些...
在方括号表达式中使用时,表示不接受该字符集合。 - `$`:匹配输入字符串的结尾位置;如果设置了多行模式,则还匹配`\n`或`\r`。 - `.`:匹配除换行符之外的任何单个字符。 - `?`:匹配前面的子表达式零次或一次。 -...
正则表达式是在 Oracle 10g 中添加的新特性,用于匹配字符串中的模式。下面是 ORACLE SQL 正则表达式的相关知识点: 匹配字符 * `[:alnum:]` 匹配任何字母和数字 * `[:alpha:]` 匹配任何字母 * `[:blank:]` 匹配...
Oracle数据库中正则表达式的应用是指在Oracle数据库管理系统中使用正则表达式来实现高效的数据检索和处理。正则表达式是一种源于Unix的强大的数据检索技术,可以对搜索条件进行灵活的控制,对于规范的格式如电话号、...
PDF文件"Oracle正则表达式函数介绍.pdf"很可能详细介绍了这些函数的使用方法、模式语法和实例,而"Oracle_正则表达式.txt"可能包含了更多示例或使用技巧。对于学习和理解Oracle正则表达式,这两个文件都是宝贵的资源...
POSIX字符类是正则表达式中的特殊字符集合,例如: - `[:alpha:]`:匹配所有字母字符(a-zA-Z)。 - `[:lower:]`:匹配所有小写字母。 - `[:upper:]`:匹配所有大写字母。 - `[:digit:]`:匹配所有数字。 - `[:alnum...
position :起始位置,从第几个字符开始正则表达式匹配(默认为1) occurrence :标识第几个匹配组,默认为1 modifier :模式(‘i’不区分大小写进行检索;’c’区分大小写进行检索。默认为’c’) SELECT REGEXP_...
正则表达式中的`.`具有广泛性,它能匹配任何字符,包括空格和特殊字符。这有时会导致非预期的结果。为了解决这个问题,可以使用**字符类**(如`[a-z]`表示小写字母)或**否定预查**(如`[^a-z]`表示除小写字母外的...
正则表达式中的元字符有特殊含义,例如: - `^`:匹配输入字符串的开始位置。 - `$`:匹配输入字符串的结尾位置。 - `.`:匹配除换行符外的任何单个字符。 - `?`:匹配前面的子表达式零次或一次。 - `+`:匹配前面...