Oracle正则表达式及测试

本文介绍了Oracle数据库中用于处理正则表达式的四个主要函数:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR和REGEXP_REPLACE。通过具体实例展示了如何使用这些函数进行数据模式匹配、替换和提取。
Oracle 中的支出正则表达式的函数主要有下面四个:

1、REGEXP_LIKE:与LIKE的功能相似
2、REGEXP_INSTR:与INSTR的功能相似
3、REGEXP_SUBSTR:与SUBSTR的功能相似
4、REGEXP_REPLACE:与REPLACE的功能相似

它们在用法上与Oracle SQL函数LIKE/INSTR/SUBSTR和REPLACE用法相同,但是它们使用POSIX正则表达式代替了老的百分号(%)和通配符(_)字符。
POSIX正则表达式由标准的元字符,(metacharacters)所构成:


'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$ '匹配输入字符的结尾位置。如果设置了REGEXP对象的multiline属性,则$也匹配'\n'或'\r'。
'.' 匹配除换行符之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'+' 匹配前面的子表达式一次或多次。
'*' 匹配前面的子表达式零次或多次。
'|' 指明两项之间的一个选择。例子'([a-z]+[0-9]+)$'表示所有小写字母或数字组合成的字符串。
'()' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。

字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何白字符。
[[:upper:]]任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号。
[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]。


各种操作符的运算优先级

\转义符
(),(?:),(?=),[] 圆括号和方括号
*,+,?,{n},{n,},{n,m}限定符
^,$,anymetacharacter 位置和顺序


搭建测试环境11g,windows7 、SQL Plus,在scott用户下

regexp_like函数

--创建表
create table fzq(
id varchar(4),
value varchar(10)
);

--数据插入
insert into fzq values('1','1234560');
insert into fzq values('2','1234560');
insert into fzq values('3','1b3b560');
insert into fzq values('4','abc');
insert into fzq values('5','abcde');
insert into fzq values('6','ADREasx');
insert into fzq values('7','123 45');
insert into fzq values('8','adc de');
insert into fzq values('9','adc,.de');
insert into fzq values('10','1B');
insert into fzq values('10','abcbvbnb');
insert into fzq values('11','11114560');
insert into fzq values('11','11124560');


--查询value中以1开头60结束的记录并且长度是7位
方法一:
SQL> select * from fzq where value like '1____60';

ID       VALUE
-------- --------------------
2        1234560
1        1234560
3        1b3b560

方法二:

SQL> select * from fzq where regexp_like(value,'1....60') and length(value) =7;

ID       VALUE
-------- --------------------
2        1234560
1        1234560
3        1b3b560

SQL>


--查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
--使用like就不是很好实现了。

方法一:
SQL> select * from fzq where regexp_like(value,'1[0-9]{4}60');

ID       VALUE
-------- --------------------
2        1234560
1        1234560
11       11114560
11       11124560

SQL> select * from fzq where regexp_like(value,'1[0-9]{4}60') and length(value) =7;

ID       VALUE
-------- --------------------
2        1234560
1        1234560

SQL>

因为正则表达式中没有表示长度的,所以只能用后面的这个查询。


方法二:也可以使用字符簇

SQL> select * from fzq where regexp_like(value,'1[[:digit:]]{4}60') and length(value)=7;

ID       VALUE
-------- --------------------
2        1234560
1        1234560

--查询value中不是纯数字的记录

SQL> select * from fzq where not regexp_like(value,'^[[:digit:]]+$');

ID       VALUE
-------- --------------------
3        1b3b560
4        abc
5        abcde
6        ADREasx
7        123 45
8        abc de
9        adc,.de
10       1B

已选择8行。

--查询value中不包含任何数字的记录。

SQL> select * from fzq where regexp_like(value,'^[^[:digit:]]+$');

ID       VALUE
-------- --------------------
4        abc
5        abcde
6        ADREasx
8        abc de
9        adc,.de

SQL>

--查询以12或者1b开头的记录.不区分大小写。

SQL> select * from fzq where regexp_like(value,'^1[2b]','i');

ID       VALUE
-------- --------------------
2        1234560
1        1234560
3        1b3b560
7        123 45
10       1B

SQL>

---查询以12或者1b开头的记录.区分大小写。

SQL> select * from fzq where regexp_like(value,'^1[2b]');

ID       VALUE
-------- --------------------
2        1234560
1        1234560
3        1b3b560
7        123 45

--

--查询数据中包含空白的记录。

SQL> select * from fzq where regexp_like(value,'[[:space:]]');

ID       VALUE
-------- --------------------
7        123 45
8        abc de

SQL>

---查询所有包含小写字母或者数字的记录。

SQL> select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');

ID       VALUE
-------- --------------------
2        1234560
1        1234560
4        abc
5        abcde
11       11114560
11       11124560

已选择6行。



--查询任何包含标点符号的记录。

SQL> select * from fzq where regexp_like(value,'[[:punct:]]');

ID       VALUE
-------- --------------------
9        adc,.de

SQL>



regexp_replace函数


--所有连续两个以上的空白改成逗号 


SQL> select regexp_replace('坐火车 去 西藏 玩 看 秀丽山川','\s+',',') 逗号隔开 from dual;

逗号隔开
--------------------------------------------------------------------------------
坐火车,去,西藏,玩,看,秀丽山川



regexp_instr函数


regexp_instr 是Oracle正则表达式中的一个函数。这个函数其实与instr函数其实相似。
regexp_instr的原型如下:
regexp_instr(x,pattern[,start[,occurrence[,return_option[,match_option]]]])
这里每个参数分别含义如下:

x待匹配的字符串
pattern 待匹配的模式
start 开始匹配的位置,如果不指定默认为1
occurrence 匹配的次数,如果不指定默认为1
return_option 指定返回值的类型,如果该参数为0,则返回值为匹配位置的第一个字符,
如果该值为非0则返回匹配值的最后一个位置。
match_option 可以用这个参数来修改一些默认的配置设置。这个值与前面所说的regexp_like函数中的match_option参数的意义是意义的。


上例子:
SQL> select instr('avdsdabasdab','a',1,1) from dual;

INSTR('AVDSDABASDAB','A',1,1)
-----------------------------
                            1

SQL>

同:
SQL> select regexp_instr('avdsdabasdab','a',1,1) from dual;

REGEXP_INSTR('AVDSDABASDAB','A',1,1)
------------------------------------
                                   1

SQL>

--从给定自动的第一个字符开始查找a字串,返回查找到第一个a的位置

SQL> select instr('avdsdabasdab','a',1,2) from dual;

INSTR('AVDSDABASDAB','A',1,2)
-----------------------------
                            6

SQL>

--从给定字段的第一个字符开始查找a字串,返回查找到第二个a的位置

SQL> select instr('avdsdabasdab','a',6,1) from dual;

INSTR('AVDSDABASDAB','A',6,1)
-----------------------------
                            6

SQL>

---从给定字段的第六个字符开始查找a字串,返回查找到第一个a的位置



regexp_substr函数


5个参数
第一个是输入的字符串
第二个是正则表达式
第三个标识从第几个字符开始正则表达式匹配。(默认为1)
第四个是标识第几个匹配组。(默认为1)
第五个是取值范围:

n:点号 . 不匹配换行符号;



全部测试数据


--创建表
create table test_reg_substr(
A varchar(50)
);

--数据插入
insert into test_reg_substr values('ABC123XYZ');
insert into test_reg_substr values('ABC123XYZ456');

--查询全部测试数据

SQL> select * from test_reg_substr;

A
--------------------------------------------------------
ABC123XYZ
ABC123XYZ456

SQL>

--检索中间的数字

SQL> select regexp_substr(a,'[0-9]+') from test_reg_substr
  2  where regexp_like(a,'[0-9]+') ;

REGEXP_SUBSTR(A,'[0-9]+')
----------------------------------------------------------------
123
123

SQL>


--检索中间的数字(从第一个字母开始匹配,找第2个匹配项目)

SQL> select nvl(regexp_substr(a,'[0-9]+',1,2),'-') as a from test_reg_substr
  2  where regexp_like(a,'[0-9]+');

A
--------------------------------------------------------------------------------
456



--取得“字符集合”

SQL> select regexp_substr(a,'\w+') from test_reg_substr
  2  where regexp_like(a,'\w+');

REGEXP_SUBSTR(A,'\W+')
-------------------------------------------------------------------
ABC123XYZ
ABC123XYZ456

--取得“字符集合”(从第一个字母开始匹配,找第2个匹配项目)

SQL> select nvl(regexp_substr(a,'\w+',1,2),'-') as a from test_reg_substr
  2  where regexp_like(a,'\w+');

A
--------------------------------------------------------------------------------
-
-

SQL>
























<think>首先,用户的问题是:“我想了解Oracle中支持的正则表达式函数及其用法 请问Oracle 正则表达式函数有哪些 使用方法”。我需要根据系统指令来回答。 系统指令关键点: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考提供的引用:[^1]和[^2]。 提供的引用: - 引用[^1]: oracle正则表达式。在Oracle中,正则表达式(Regular Expressions)是通过正则表达式函数(如REGEXP_LIKE,REGEXP_INSTR,REGEXP_SUBSTR,REGEXP_REPLACE, 和REGEXP_COUNT)来使用的。这些函数允许你执行复杂的模式匹配和字符串操作。 - 引用[^2]: 正则表达式截取函数oracle,oracle正则表达式函数 substr instr简单分析。2、REGEXP_LIKE(x,pattern[,match_option])用于在x中查找正则表达式pattern,该函数还可以提供一个可选的参数match_option字符串说明默认的匹配选项。match_option的取值如下: 用户的问题是关于Oracle正则表达式函数及其用法,所以我需要基于这些引用构建回答。 回答结构: 1. **介绍**:简要介绍Oracle中的正则表达式函数。 2. **列出函数**:列出主要的正则表达式函数,并简要描述每个函数。 3. **详细用法**:为每个函数提供详细的用法说明,包括语法、参数和示例。 4. **添加引用**:在适当的地方添加引用标识。 5. **生成相关问题**:在回答末尾生成相关问题。 6. **使用中文**:整个回答用中文。 主要函数从引用中提取: - REGEXP_LIKE - REGEXP_INSTR - REGEXP_SUBSTR - REGEXP_REPLACE - REGEXP_COUNT 另外,引用[^2]提到了REGEXP_LIKE的match_option参数。 我需要确保回答真实可靠。基于我的知识: - Oracle支持这些函数:REGEXP_LIKE, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_REPLACE, REGEXP_COUNT。 - 用法包括参数如字符串、正则表达式模式、可选参数等。 数学表达式:用户问题可能不涉及数学,但如果需要,我会使用$...$格式。在这个上下文中,可能不需要数学表达式,但如果有,比如在示例中,我会处理。 回答结构: - 开头:介绍Oracle正则表达式函数。 - 主体:逐一介绍每个函数,语法和示例。 - 结尾:总结并生成相关问题。 引用标识:在引用段落末尾添加[^1]或[^2]。例如,当提到引用内容时。 生成相关问题:在最后,添加“相关问题”部分。 最终输出格式: - 回答内容。 - §§相关问题§§ - 相关问题列表。 现在,构建回答: 1. **介绍**:Oracle提供了一系列正则表达式函数来处理字符串匹配和操作。这些函数基于POSIX正则表达式标准,允许复杂的模式匹配[^1]。 2. **函数列表**: - REGEXP_LIKE: 检查字符串是否匹配正则表达式。 - REGEXP_INSTR: 返回匹配子字符串的位置。 - REGEXP_SUBSTR: 提取匹配的子字符串。 - REGEXP_REPLACE: 替换匹配的子字符串。 - REGEXP_COUNT: 计算匹配的次数。 3. **详细用法**: - 对于每个函数,提供语法、参数说明和示例。 - 例如,REGEXP_LIKE: 语法:REGEXP_LIKE(source_string, pattern [, match_option])。示例:SELECT * FROM table WHERE REGEXP_LIKE(column, '^A.*Z$'); - 引用[^2]提到match_option,如 'i' 忽略大小写。 4. **添加引用**:在描述函数时,如果基于引用,添加[^1]或[^2]。 5. **相关问题**:如“如何使用REGEXP_REPLACE进行字符串替换?”或“正则表达式Oracle中的性能优化”。 确保LaTeX:可能不需要,但如果有数学,比如在示例中,我会用$...$。 用户问题中没有数学,所以可能不需要。</think>### Oracle 正则表达式函数及其用法介绍 Oracle 数据库提供了一系列内置的正则表达式函数,用于处理复杂的字符串匹配、提取和操作。这些函数基于 POSIX 正则表达式标准,支持强大的模式匹配功能,可应用于数据清洗、查询过滤和字符串处理等场景[^1]。以下是 Oracle 中支持的五个主要正则表达式函数及其详细用法。我将逐一介绍每个函数的语法、参数、示例和注意事项,帮助您逐步掌握其使用方法。 #### 1. **REGEXP_LIKE** - **功能**:检查源字符串是否匹配指定的正则表达式模式。常用于 WHERE 子句中过滤数据。 - **语法**: ```sql REGEXP_LIKE(source_string, pattern [, match_option]) ``` - **参数说明**: - `source_string`:要检查的源字符串。 - `pattern`:正则表达式模式(例如 `'^A.*Z$'` 表示以 A 开头、Z 结尾的字符串)。 - `match_option`(可选):匹配选项字符串,控制匹配行为。常用选项包括: - `'i'`:忽略大小写(case-insensitive)。 - `'c'`:区分大小写(case-sensitive,默认)。 - `'m'`:多行模式(将字符串视为多行)。 - `'n'`:允许点号(.)匹配换行符[^2]。 - **示例**: ```sql -- 检查名字是否以 'J' 开头并以 'n' 结尾(忽略大小写) SELECT * FROM employees WHERE REGEXP_LIKE(first_name, '^J.*n$', 'i'); ``` - **注意事项**:如果省略 `match_option`,默认区分大小写。该函数返回布尔值(TRUE 或 FALSE)。 #### 2. **REGEXP_INSTR** - **功能**:返回正则表达式模式在源字符串中首次出现的位置(索引)。适用于定位子字符串。 - **语法**: ```sql REGEXP_INSTR(source_string, pattern [, start_position [, occurrence [, return_option [, match_option]]]]) ``` - **参数说明**: - `source_string`:源字符串。 - `pattern`:正则表达式模式。 - `start_position`(可选):搜索起始位置(默认为 1)。 - `occurrence`(可选):指定匹配的序号(例如 1 表示首次匹配,默认为 1)。 - `return_option`(可选):返回类型(0 返回匹配起始位置,1 返回匹配结束位置,默认为 0)。 - `match_option`(可选):同 REGEXP_LIKE 的选项[^1]。 - **示例**: ```sql -- 查找字符串中第一个数字的位置 SELECT REGEXP_INSTR('Order123', '\d+') AS position FROM dual; -- 结果:6(数字 '123' 的起始索引) ``` - **注意事项**:索引从 1 开始计数。如果未找到匹配,返回 0。 #### 3. **REGEXP_SUBSTR** - **功能**:从源字符串中提取匹配正则表达式模式的子字符串。常用于数据提取。 - **语法**: ```sql REGEXP_SUBSTR(source_string, pattern [, start_position [, occurrence [, match_option]]]) ``` - **参数说明**: - `source_string`:源字符串。 - `pattern`:正则表达式模式。 - `start_position`(可选):搜索起始位置(默认为 1)。 - `occurrence`(可选):指定匹配的序号(默认为 1)。 - `match_option`(可选):同 REGEXP_LIKE 的选项[^1]。 - **示例**: ```sql -- 提取邮箱地址中的域名部分 SELECT REGEXP_SUBSTR('user@example.com', '@(\w+\.\w+)', 1, 1, 'i') AS domain FROM dual; -- 结果:'@example.com' ``` - **注意事项**:如果未指定捕获组,默认返回整个匹配部分;使用捕获组(如 `'(\w+)'`)可提取子部分。 #### 4. **REGEXP_REPLACE** - **功能**:替换源字符串中匹配正则表达式模式的部分。适用于字符串清洗和格式化。 - **语法**: ```sql REGEXP_REPLACE(source_string, pattern, replace_string [, start_position [, occurrence [, match_option]]]) ``` - **参数说明**: - `source_string`:源字符串。 - `pattern`:正则表达式模式。 - `replace_string`:替换字符串(可使用反向引用如 `\1`)。 - `start_position`(可选):搜索起始位置(默认为 1)。 - `occurrence`(可选):指定匹配的序号(默认为 0,表示所有匹配)。 - `match_option`(可选):同 REGEXP_LIKE 的选项[^2]。 - **示例**: ```sql -- 将电话号码格式化为标准格式 SELECT REGEXP_REPLACE('123-456-7890', '(\d{3})-(\d{3})-(\d{4})', '(\1) \2-\3') AS formatted_phone FROM dual; -- 结果:'(123) 456-7890' ``` - **注意事项**:`replace_string` 可以包含正则表达式组引用(例如 `\1` 表示第一个捕获组)。 #### 5. **REGEXP_COUNT** - **功能**:计算源字符串中匹配正则表达式模式的次数。用于统计匹配频率。 - **语法**: ```sql REGEXP_COUNT(source_string, pattern [, start_position [, match_option]]) ``` - **参数说明**: - `source_string`:源字符串。 - `pattern`:正则表达式模式。 - `start_position`(可选):搜索起始位置(默认为 1)。 - `match_option`(可选):同 REGEXP_LIKE 的选项[^1]。 - **示例**: ```sql -- 统计字符串中元音字母的出现次数 SELECT REGEXP_COUNT('Hello World', '[aeiou]', 1, 'i') AS vowel_count FROM dual; -- 结果:3(忽略大小写,匹配 'e','o','o') ``` - **注意事项**:该函数返回整数计数,如果未找到匹配,返回 0。 ### 使用注意事项 - **性能优化**:正则表达式操作可能影响查询性能,尤其在大型数据集上。建议在 WHERE 子句中结合索引使用,或预先过滤数据[^1]。 - **兼容性**:这些函数在 Oracle 10g 及以上版本支持。正则表达式语法遵循 POSIX 标准,支持常见元字符如 `.`(任意字符)、`*`(零次或多次)、`+`(一次或多次)等。 - **错误处理**:如果模式无效,Oracle 会抛出 ORA-12733 错误。测试时可在 SQL*Plus 或 SQL Developer 中运行小规模查询。 - **与标准函数比较**:相比传统函数如 `SUBSTR` 或 `INSTR`,正则表达式函数更灵活,但资源消耗更高。在简单场景下,优先使用标准函数[^2]。 通过以上函数,您可以高效处理字符串匹配任务。例如,在数据仓库中清洗电子邮件地址或日志分析时,REGEXP_SUBSTR 和 REGEXP_REPLACE 非常实用[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值