Oracle 正则表达式以及常用正则函数
正则表达式简介
- 什么是正则表达式?
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
- 什么时候会用到正则表达式?
数据验证
字符串查找
字符串替换
正则表达式基础
元字符 | 描述 |
---|---|
* | 匹配0次1次或多次其前的原子,等价于{0,} |
+ | 匹配一次或多次其前的原子,等价于{1,} |
? | 匹配0次或1次其前的原子,等价于{0,1} |
| | 匹配两个或多个分支选择 |
{n} | 表示其前面的原子恰好出现n次 |
{n,} | 表示其前面的原子出现不小于n次,即大于等于n次 |
{n,m} | 表示其前面的原子至少出现n次,最多出现m次 |
^或\A | 匹配输入字符的开始的位置(或在多行模式下行的开头,即紧随一个换行符之后) |
$或\Z | 匹配输入行尾。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置 |
[] | 匹配方括号中的任意一个原子 |
[^] | 匹配除了方括号中的原子以外的任意一个字符 |
() | 匹配其整体为一个原子,即模式单元 |
\ n | 反向引用表达式(n 是 1 到 9 之间的数字)匹配包含在 \n 之前的 ‘(’ 和 ‘)’ 之间的第n个子表达式 |
[..] | 指定一个排序规则元素,并且可以是多字符元素(例如,西班牙语中的 [.ch.]) |
[: :] | 指定字符类(例如,[:alpha:]),它匹配字符类中的任何字符 |
[==] | 指定等价类。例如,[=a=] 匹配所有具有基本字母 ‘a’ 的字符。 |
字符簇 | 描述 |
[:alpha:] | 任何字母 |
[:digit:] | 任何数字 |
[:alnum:] | 任何字母和数字 |
[:space:] | 任何空白字符 |
[:upper:] | 任何大写字母 |
[:lower:] | 任何小写字母 |
[:punct:] | 任何标点符号 |
[:xdigit:] | 任何16进制的数字,相当于[0-9a-fA-F] |
[:cntrl:] | 控制字符,ctrl、backspace等 |
[:graph:] | 图像字符 |
[:print:] | 打印字符 |
[:blank:] | 空格和tab |
普通原子 | 描述 |
可见原子 | a-z、A-Z、0-9;小写英文字母、大写英文字母、数字 |
不可见原子 | \n、(new line 换行)、\r、(Carriage return 回车)、\t、水平制表符、\v、垂直制表、\f 、换页 |
注意 | 可见原子可以在中括号中使用 |
特殊字符 | 描述 |
$(){[|\.^*+? | 这些特殊字符需要添加反斜杠\、进行转义 |
. | 查找单个字符除了换行和行结束符 |
通用字符类 | 描述 |
\d | 任意十进制数字(含:阿拉伯数字ⅠⅡⅢⅣⅤ),等价于[0-9] |
\D | 任意非十进制数字,等价于[^0-9] |
\w | 任意单词字符,等价于[a-zA-Z0-9] |
\W | 任意非单词字符,等价于[^a-zA-Z0-9] |
\s | 匹配任意空白字符,等价于[\f\n\r\t\v] |
\S | 匹配任意非空白字符,等价于[^\f\n\r\t\v] |
注意: | 通用字符类在括号中可以使用、在中括号中不可以 |
https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix001.htm#BABJDBHB
Oracle 常用正则函数
Oracle 正则函数 | 描述 |
---|---|
regexp_like | 使用正则模糊匹配数据,和 like 类似 |
regexp_substr | 使用正则截取数据,和substr类似 |
regexp_instr | 使用正则匹配字符串,返回一个整数;没有找到匹配,则函数返回0;和instr类似 |
regexp_replace | 使用正则替换数据,和replace类似 |
regexp_count | 使用正则统计数据,和count类似 |
- REGEXP_LIKE语法
REGEXP_LIKE(source_char, pattern, match_parameter)
source_char:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
match_parameter:匹配选项
i 忽略大小写;
c 区分大小写;
n:允许将句点“.”作为通配符来匹配换行符。如果省略该参数,句点将不匹配换行符;
m:多行模式;
x:忽略空白字符;默认情况下,空白字符与自身匹配;
默认 区分大小写、句点不匹配换行符、源串被看作一行
- 示例
--建表语句
create table test3(
a varchar2(100)
);
--insert语句
insert into test3 values('慢性肾脏病1期,1型糖尿病,妊娠');
insert into test3 values('ckd1期,xxxx糖尿病 ');
insert into test3 values('I期x糖尿病');
insert into test3 values('一期xxx糖尿病');
insert into test3 values('Ⅰ期XXX糖尿病');
insert into test3 values('糖尿病 ,慢性肾脏病1期,妊娠');
insert into test3 values('糖尿病,ckd1期');
insert into test3 values('糖尿病xxxI期');
insert into test3 values('糖尿病xxx一期');
insert into test3 values('糖尿病xxxⅠ期');
insert into test3 values('I期
x糖尿病');
insert into test3 values('I期X糖尿病');
insert into test3 values('糖尿病');
insert into test3 values('I期糖尿病');
insert into test3 values('I期
糖尿病');
insert into test3 values('I期x 糖尿病');
insert into test3 values('I期x 糖尿病');
insert into test3 (a)values('慢性肾脏病2期,1型糖尿病,妊娠');
insert into test3 (a)values('慢性肾脏病3期,1型糖尿病,妊娠');
commit;
--返回的结果一样
select * from test3 where regexp_like(a, '^一.*$');
--result:一期xxx糖尿病
select * from test3 where a like '一%';
--result:一期xxx糖尿病
--诊断中有“1期|一期|I期|Ⅰ期,2期|二期|II期|Ⅱ期,3期|三期|III期|Ⅲ期”之类关键字,且有“糖尿病”关键字诊断;
select * from test3 where regexp_like(a,'[一二三123IⅠ]期.*糖尿病','i');
select * from test3 where regexp_like(a,'糖尿病.*[一二三123IⅠ]期','i');
--糖尿病+肾病几期(ckd:指的是慢性肾脏病)
select * from test3 where regexp_like(a,'肾.*[一二三123IⅠ]期.*糖尿病','i');
select * from test3 where regexp_like(a,'糖尿病.*肾.*[一二三123IⅠ]期','i');
select * from test3 where regexp_like(a,<