Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1341973
  • 博文数量: 169
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3800
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc

文章分类

全部博文(169)

文章存档

2024年(24)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

分类: Oracle

2023-05-08 16:27:52

要在 SQL 或 PL/SQL 中实现正则表达式,需要使用一组新函数。这些函数为:

函数名 说明
REGEXP_LIKE 类似于 LIKE 运算符,但执行正则表达式匹配而不是简单的模式匹配
REGEXP_INSTR 在给定字符串中搜索某个正则表达式模式,并返回匹配项的位置。
REGEXP_REPLACE 搜索某个正则表达式模式并使用替换字符串替换它
REGEXP_SUBSTR 在给定字符串中搜索某个正则表达式模式并返回匹配的子字符串

元字符

元字符是具有特殊意义的字符,如通配符字符、重复字符、非匹配字符或一个字符范围。

可以在与函数匹配的模式中使用多个预定义的元字符符号。

符号 说明
*

匹配零个或多个匹配项

|

用于指定选择性匹配项的选择性运算符

^/$
     

匹配行的开头和结尾

[]

用于匹配列表(匹配该列表中的任何表达式)的方括号表达式

[^exp]

如果插入字符位于方括号内部,则它对表达式取非。

{m}

精确匹配 m 次

{m,n}

至少匹配 m 次,但不超过 n 次

[: :]

指定一个字符类并匹配该类中的任何字符

\

可以有四种不同的含义:(1) 表示它自身;(2) 引用下一个字符;(3) 引入一个运算符;(4) 不执行任何操作

+

匹配一个或多个匹配项

?

匹配零个或一个匹配项

.

匹配所支持字符集中的任何字符(NULL 除外)

()

对表达式进行分组(视作一个子表达式)

\n

后向引用表达式

[==]
     

指定等价类

[..]
     

指定一个对照元素(如多字符元素)




--test data
create table regtest(a varchar2(100));
insert into regtest values('afd][;/123456');
insert into regtest values('ad;123');
insert into regtest values(123);
insert into regtest values('abc');
commit;


select * from regtest;


--regexp_like和like的功能差不多,匹配是否含有,下面就是找字段a中有数字的所有记录
select * from regtest where regexp_like(a,'\d+');


--regexp_substr,取匹配到的所有字符


select regexp_substr('afd][;/123456','\d+') from dual;


--regexp_replace,替换所有匹配到的字符
select regexp_replace('afd][;/123456','\D+','') from dual;


--regexp_instr返回{BANNED}中国第一次匹配到的字符的位置


select regexp_instr('afd][;/123456',';') from dual;--返回6
select regexp_replace('xx-x^^^xxx^^xx^,xx-xx-xxxxxx^,','\^+') from dual;--删除含有^的,一个或多个,^是正则的特殊字符表示开始,因此必须要加反斜杠转义


--regexp pattern
-- .匹配任何除空行之外的单个字符,widnows,unix,chr(10)表示new line
--字符匹配元字符
select regexp_replace('abc'||chr(10)||'dfg','...','123') from dual;--将联系的3个数替换,除chr(10)外


select regexp_replace('abcd123gf','[a-z]','0') from dual;--将a到z之间的字母全部替换为0


select regexp_replace('abcd123gf','[^a-z]','0') from dual;--与上面的相反,将不是a到z之间的字符替换为0


select regexp_replace('abc hello word','\w','m') from dual;--将所有的单词字符替换成字符m


select regexp_replace(' d b c  a','\s+','w') from dual;--将所有的空格包括连续的空格,替换成字符w


--量词
select regexp_replace('aa1b23c23232','\d+','_') from dual;--将一个或多个数字替换成_


select regexp_replace('aa1b23c23232','\d?','?') from dual;
select regexp_replace('abcd123gf','[^a-z]{2}','0') from dual;--恰好两次
select regexp_replace('abcd123gf','[^a-z]{2,}','0') from dual;--{BANNED}最佳少两次
select regexp_replace('abcd123gf','[^a-z]{2,3}','0') from dual;--{BANNED}最佳少两次,{BANNED}最佳多3次

后向引用
\转义,\1,\2,\3分别后向引用元组


SQL> select regexp_replace('10/20/2010','^([0-9]{2})/([0-9]{2})/([0-9]{4})','\3-\1-\2') from dual;
 
REGEXP_REPLACE('10/20/2010','^
------------------------------
2010-10-20
 




--截取[]内数据,要转义,后面用\1得到元组内数据,元组是(内的数据)
SQL> select regexp_replace('SDFD[ABC]SS','.*\[(.*)\].*','\1') str from dual;


STR
---
ABC




select  regexp_substr('SDFD[ABC]SS', '\[(.*)]', 1, 1, 'i', 1)
from    dual;


SELECT regexp_replace(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),
                      '([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})',
                      '\1年\2月\3日')
FROM   dual; 




--交换位置
select regexp_replace('John, Smith','^([^,*]{1,}),([^,*]{1,})','\2 \1') from dual;


--加引号
select regexp_replace('John,Smith','^([^,*]{1,}),([^,*]{1,})','''\1'',''\2''') from dual;



阅读(6901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~