要在 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;