Oracle 正则表达式以及常用正则函数

Oracle 正则表达式以及常用正则函数

  • 正则表达式简介
  • 正则表达式基础
  • Oracle 常用正则函数

正则表达式简介

菜鸟教程
练习网站
软件下载

  1. 什么是正则表达式?

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

  1. 什么时候会用到正则表达式?

数据验证
字符串查找
字符串替换

正则表达式基础

元字符 描述
* 匹配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语法
    avator

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<

你可能感兴趣的:(正则表达式,字符串,regex,数据库,sql)