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

Oracle 正则表达式以及常用正则函数Oracle正则表达式以及常用函数正则表达式简介正则表达式基础Oracle常用函数正则表达式简介菜鸟教程练习网站1练习网站2练习网站3练习网站4软件下载什么是正则表达式?正则表达式,又称规则表达式。(英语:RegularExpression,在代码中简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。什么时候会用到正则表达式?数据验证字符串查找字符串替换正则表达式基础元字符描述

大家好,又见面了,我是你们的朋友全栈君。

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 test3 where regexp_like(a,'ckd[一二三123IⅠ]期.*糖尿病','i');
select * from test3 where regexp_like(a,'糖尿病.*ckd[一二三123IⅠ]期','i');
select * from test3 where regexp_like(a,'(^.*糖尿病$)'); --贪婪匹配
select * from test3 where regexp_like(a,'(^.*?糖尿病$)');--非贪婪匹配
select * from test3 where regexp_like(a,'(^.+糖尿病$)'); --糖尿病匹配不出来,前面至少出现一个字符
select * from test3 where regexp_like(a,'(\s)'); --匹配任意空白字符,等价于[\f\n\r\t\v]
select * from test3 where regexp_like(a,'(\S)'); --匹配任意非空白字符,等价于[^\f\n\r\t\v]
select * from test3 where regexp_like(a,'(^.{2}糖尿病$)'); --糖尿病前面的字符出现两次
select * from test3 where regexp_like(a,'(^.{2,}糖尿病$)');--糖尿病前面的字符出现大于等于两次
select * from test3 where regexp_like(a,'(^.{2,3}糖尿病$)');--糖尿病前面的字符至少出现两次,最多出现3次
select * from test3 where regexp_like(a,'x.*糖尿病','i'); --i 忽略大小写
select * from test3 where regexp_like(a,'x.*糖尿病','c'); --c 区分大小写(默认)
select * from test3 where regexp_like(a,'...糖尿病','n'); --. 查找单个字符除了换行和行结束符;n 允许将句点“.”作为通配符来匹配换行符。如果省略改参数,句点将不匹配换行符
select * from test3 where regexp_like(a,'...糖尿病'); --. 查找单个字符除了换行和行结束符;n 允许将句点“.”作为通配符来匹配换行符。如果省略改参数,句点将不匹配换行符
select * from test3 where regexp_like(a,'^糖尿病$'); --匹配糖尿病的只有1条
select * from test3 where regexp_like(a,'^糖尿病$','m'); --m 多行模式,将字符串为多行。默认的正则开始"^“和结束”$"将目标字符串作为单一的一"行"字符。加上m后,那么开始和结束将会指字符串的每一行
select * from test3 where regexp_like(a,'[a-z]'); --模糊匹配小写英文字母的数据
select * from test3 where regexp_like(a,'[A-Z]'); --模糊匹配大写英文字母的数据
select * from test3 where regexp_like(a,'[0-9]'); --模糊匹配带数值的数据
select * from test3 where regexp_like(a,'[a-zA-Z0-9]'); --模糊匹配任意单词字符,等价于(a-zA-Z0-9],不匹配汉字
SELECT * FROM test3 WHERE regexp_like(a,'[123]')--匹配方括号中的任意一个原子
  • 官网示例
--创建员工表
create table employees(
last_name varchar2(10)
);
--insert语句
insert into employees (last_name)values('1A_B2');
insert into employees (last_name)values('A_B');
insert into employees (last_name)values('AbB');
commit;
--like模糊匹配A_B数据,中间的下划线需要转义,否者是匹配AB中的任意一个字符;
select last_name from employees where last_name like '%A/_B%' escape '/';
/*result 1 1A_B2 2 A_B*/
--只获取A_B数据,_下划线需要转义;
select last_name FROM employees where last_name like 'A/_B' escape '/';
--result:A_B
--未转义,匹配AB中的任意一个字符;
SELECT last_name FROM employees WHERE last_name LIKE 'A_B' ;
/* result 1 A_B 2 AbB*/
--未转义,匹配AB中的任意一个字符,且模糊匹配A_B;
SELECT last_name FROM employees WHERE last_name LIKE '%A_B%' ;
/* result 1 1A_B2 2 A_B 3 AbB*/
--删除员工表
DROP TABLE employees;
--创建员工表
CREATE TABLE employees(
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(20)
);
--insret数据
INSERT INTO  employees (FIRST_NAME,LAST_NAME)VALUES('Steven','King');
INSERT INTO  employees (FIRST_NAME,LAST_NAME)VALUES('Steven','Markle');
INSERT INTO  employees (FIRST_NAME,LAST_NAME)VALUES('Stephen','Stiles');
COMMIT;
--下面的查询返回名字为Steven或Stephen的员工的姓和名(其中first_name以Ste开头,以en结尾,中间是v或ph):
select first_name, last_name from employees where regexp_like (first_name, '^Ste(v|ph)en$');
/* FIRST_NAME LAST_NAME -------------------- ------------------------- Steven King Steven Markle Stephen Stiles*/
-----------------------------------------------
INSERT INTO employees(last_name) VALUES('De Haan');
INSERT INTO employees(last_name) VALUES('Greenberg');
INSERT INTO employees(last_name) VALUES('Khoo');
INSERT INTO employees(last_name) VALUES('Gee');
INSERT INTO employees(last_name) VALUES('Greene');
INSERT INTO employees(last_name) VALUES('Lee');
INSERT INTO employees(last_name) VALUES('Bloom');
INSERT INTO employees(last_name) VALUES('Feeney');
COMMIT;
--下面的查询返回姓氏中有双元音的员工的姓氏(last_name包含两个相邻的a、e、i、o或u,无论大小写):
SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i');
/* LAST_NAME ------------------------- De Haan Greenberg Khoo Gee Greene Lee Bloom Feeney*/

regexp_like学习网址
官网

  • REGEXP_SUBSTR语法
    avator

REGEXP_SUBSTR(source_char, pattern, position, occurrence, match_parameter)
source_char:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
position:起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0
occurrence:是指示发生的正整数pattern中source_char的Oracle应搜索。默认值为 1,这意味着 Oracle 搜索第一次出现的pattern。
match_parameter:匹配选项
i 忽略大小写;
c 区分大小写;
n:允许将句点“.”作为通配符来匹配换行符。如果省略该参数,句点将不匹配换行符;
m:多行模式;
x:忽略空白字符;默认情况下,空白字符与自身匹配;
默认 区分大小写、句点不匹配换行符、源串被看作一行

  • 示例
--截取12
select regexp_substr('abc 123456 cd','12' ) regexp_substr from dual; 
--result:12
--[[:digit:]] 匹配任何数字;{5} 表示其前面的原子恰好出现5次;
select regexp_substr('abc 123456 cd','[[:digit:]]{5}' ) regexp_substr from dual;
--result:12345
--[[:alpha:]] 匹配任何字母;{1,} 表示其前面的原子出现不小于1次,即大于等于1次;1 起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0;3 获取第3个分割出来的组(分割后最初的字符串会按分割的顺序排列成组);
select regexp_substr('a b c 80831 d e f', '[[:alpha:]]{1,}', 1, 3) regexp_substr from dual;
--result:c
--需求:根据特殊符号空格将数据拆分成多行;
--分析:把要输出来的第几个子串,通过一个变量level转换成输出多少个子串。level<=5代表的是输出5个,没有的为null。
select regexp_substr('糖尿病,肾病,高血压、肾功能不全 慢性肾功能不全','[^,|,| |、 ]+',1,LEVEL) diag_name from dual
connect by level <= length('糖尿病,肾病,高血压、肾功能不全 慢性肾功能不全') -length(regexp_replace('糖尿病,肾病,高血压、肾功能不全 慢性肾功能不全','[,|,| |、 ]+',''))+1;
/*DIAG_NAME 1 糖尿病 2 肾病 3 高血压 4 肾功能不全 5 慢性肾功能不全*/
--表示输出5行
SELECT length('糖尿病,肾病,高血压、肾功能不全 慢性肾功能不全') -length(regexp_replace('糖尿病,肾病,高血压、肾功能不全 慢性肾功能不全','[,|,| |、 ]+',''))+1 FROM dual;
--result:5
  • 官网示例
--下面的示例检查该字符串,查找以逗号分隔的第一个子字符串。Oracle数据库搜索一个逗号,后面跟着一个或多个非逗号字符,后面跟着一个逗号。Oracle返回子字符串,包括开头和结尾的逗号。
SELECT
REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA',
',[^,]+,') "REGEXPR_SUBSTR"
FROM DUAL;
/* REGEXPR_SUBSTR ----------------- , Redwood Shores,*/
--下面的示例检查字符串,寻找http://后跟由一个或多个字母数字字符组成的子字符串,还可以选择一个句点(.)。Oracle搜索该子字符串在http://和斜杠(/)或字符串结尾之间最少出现3次,最多出现4次。
SELECT
REGEXP_SUBSTR('http://www.oracle.com/products',
'http://([[:alnum:]]+\.?){3,4}/?') "REGEXP_SUBSTR"
FROM DUAL;
/* REGEXP_SUBSTR ---------------------- http://www.oracle.com/*/
--[:alnum:]匹配字母和数字
SELECT
REGEXP_replace('http://www.oracle.com/products',
'[[:alnum:]]','') "REGEXP_SUBSTR"
FROM DUAL;
--result: ://../
--测试 
SELECT
REGEXP_SUBSTR('http://www.oracle.com/products',
'http://([[:alnum:]]+\.?){3}/?') "REGEXP_SUBSTR"
FROM DUAL;
/* REGEXP_SUBSTR ---------------------- http://www.oracle.com/*/

regexp_substr学习网址
官网

  • REGEXP_INSTR语法
    avator

REGEXP_INSTR (source_char, pattern , position , occurrence , return_option , match_parameter)
source_char:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
position:起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0
occurrence:是指示发生的正整数pattern中source_char的Oracle应搜索。默认值为 1,这意味着 Oracle 搜索第一次出现的pattern。
return_option:可选 指定Oracle返回的位置:如果指定0,那么Oracle将返回出现的第一个字符的位置。这是默认的。如果指定1,则Oracle返回字符之后发生的位置。
match_parameter:匹配选项
i 忽略大小写;
c 区分大小写;
n:允许将句点“.”作为通配符来匹配换行符。如果省略该参数,句点将不匹配换行符;
m:多行模式;
x:忽略空白字符;默认情况下,空白字符与自身匹配;
默认 区分大小写、句点不匹配换行符、源串被看作一行

  • 示例
--返回找到的匹配字符串的位置,是一个整数(匹配单字符)
select regexp_instr('12.345', '\.') regexp_instr from dual; 
--result:3
--1为开始位置 “2”是搜索第二个匹配的,”0”是return_option 返回出现的第一个字符位置“c”是区分大小写(默认是区分大小写) ,所以将返回5
select regexp_instr ('abAbabcd', 'a', 1, 2, 0, 'c') from dual; 
--result:5
--1 为开始位置;“2” 是搜索第二个匹配的;”1” Oracle返回字符之后发生的位置;“c”是区分大小写(默认是区分大小写) 
select regexp_instr ('abAbabcd', 'a', 1, 2, 1, 'c') from dual; 
--result:6
--第一个1 起始位置;第二个1 第几个组;0 表示将返回出现的第一个字符的位置;i 表示忽略大小写; (匹配多个字符)
select regexp_instr ('ABCd abc', 'abc', 1, 1, 0, 'i')from dual;
--result:1
--4 起始位置;第二个1 第几个组;0 表示将返回出现的第一个字符的位置;i 表示忽略大小写; (匹配多个字符)
select regexp_instr ('ABCd abc', 'abc', 4, 1, 0, 'i')from dual;
--result:6
--使用 | 模式。该|模式用于像一个”或”指定多个替代方案
select regexp_instr ('cdefg', 'a|i|o|e|u') from dual;
-- Result: 3
  • 官网示例
--下面的示例检查字符串,寻找出现的一个或多个非空字符。Oracle从字符串的第一个字符开始搜索,并返回第6个出现的非空字符的起始位置(默认值)。
SELECT
REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
'[^ ]+', 1, 6) "REGEXP_INSTR"
FROM DUAL;
/* REGEXP_INSTR ------------ 37 */
--下面的示例检查字符串,查找出现的以s、r或p开头的单词,无论大小写如何,后面跟着任意6个字母字符。Oracle从字符串中的第三个字符开始搜索,并返回该字符在字符串中第二次出现以s、r或p开头的7个字母单词之后的位置,无论大小写如何。
SELECT
REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
'[s|r|p][[:alpha:]]{6}', 3, 2, 1, 'i') "REGEXP_INSTR"
FROM DUAL;
/* REGEXP_INSTR ------------ 28*/
--竖线去掉结果是一样的。 
SELECT
REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
'[srp][[:alpha:]]{6}', 3, 2, 1, 'i') "REGEXP_INSTR"
FROM DUAL;
/* REGEXP_INSTR ------------ 28*/
--0 可选 指定Oracle返回的位置:如果指定0,那么Oracle将返回出现的第一个字符的位置。这是默认的。如果指定1,则Oracle返回字符之后发生的位置。 
SELECT
REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
'[srp][[:alpha:]]{6}', 3, 2, 0, 'i') "REGEXP_INSTR"
FROM DUAL;
/* REGEXP_INSTR ------------ 21*/  

regexp_instr学习网址
官网

  • REGEXP_REPLACE语法
    avator

REGEXP_REPLACE (source_char, pattern,replace_string , position , occurrence ,match_parameter )
source_char:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
replace_string:替换的字符串,也可以是正则
position:起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0
occurrence:是一个非负整数,表示替换操作的发生:如果指定 0,则 Oracle 将替换所有匹配项。如果您指定一个正整数n,则 Oracle 将替换第nth 个出现。
match_parameter:匹配选项
i 忽略大小写;
c 区分大小写;
n:允许将句点“.”作为通配符来匹配换行符。如果省略该参数,句点将不匹配换行符;
m:多行模式;
x:忽略空白字符;默认情况下,空白字符与自身匹配;
默认 区分大小写、句点不匹配换行符、源串被看作一行

  • 示例
--将123替换成456
select regexp_replace('123456','123','456') from dual;
--result:456456
--将数字替换成空
select regexp_replace('a1b2c3','[0-9]','') as regexp_replace from dual;
--result:abc
--替换数字0-2
SELECT regexp_replace('a1b2c3','[0-2]','') FROM dual; 
--result:abc3
--将小写字母替换成空(替换的字符串不写,默认替换成'')
select regexp_replace('a1b2c3','[a-z]') as regexp_replace from dual;
--result:123
--将非小写字母替换成空
select regexp_replace('a1b2c3','[^a-z]') as regexp_replace from dual;
--result:abc
--替换第二次匹配到的值
select regexp_replace('123a45a6','a','b',1,2) from dual;
--result:123a45b6
--剔除否认数据(贪婪匹配)
SELECT '既往糖尿病、冠心病史多年,一直口服药物治疗,现控制良好,否认有高血压病史,否认肝炎、结核病,否认有手术外伤史,否认有药物及食物过敏史,无输血史。',
REGEXP_REPLACE('既往糖尿病、冠心病史多年,一直口服药物治疗,现控制良好,否认有高血压病史,否认肝炎、结核病,否认有手术外伤史,否认有药物及食物过敏史,无输血史。',
'否认.+',
'')
FROM dual;
select a,regexp_replace(a,'[[:alpha:]]',' ') from test3; --任何字母(包含:汉字、大小写英文),替换成空
select a,regexp_replace(a,'[[:alpha:]]|[[:digit:]]','') from test3; --任何字母(包含:汉字、大小写英文)且任何数字,替换成空(可以查看数据有哪些特殊符号)
select a,regexp_replace(a,'[[:digit:]]','') from test3; --任何数字,替换成空(注意:阿拉伯数字(Ⅰ)不会替换成空)
select a,regexp_replace(a,'[[:alnum:]]','') from test3; --任何字母和数字,替换成空(可以查看数据有哪些特殊符号)
select a,regexp_replace(a,'[[:space:]]','') from test3; --任何空白字符,替换成空(任何空白字符包含:回车换行、空格)
select a,regexp_replace(a,'[[:upper:]]','') from test3; --任何大写字母,替换成空
select a,regexp_replace(a,'[[:lower:]]','') from test3; --任何小写字母,替换成空
select a,regexp_replace(a,'[[:punct:]]',' ') from test3; --任何标点符号,替换成空格
select a,regexp_replace(a,'[[:xdigit:]]','') from test3; --任何16进制的数字(包含:大小写 A、B、C、D、E、F),替换成空
SELECT a,regexp_replace(a,'[[:cntrl:]]','') FROM test3; --控制字符(很少会用到)
SELECT a,regexp_replace(a,'[[:graph:]]','') FROM test3; --匹配任意图像字符,等价于[^a-zA-Z0-9]和汉字,只留下阿拉伯数字Ⅰ、空格、回车换行\r 回车 \n 换行
SELECT a,regexp_replace(a,'[[:print:]]','') FROM test3; --匹配任意打印字符,等价于[^a-zA-Z0-9]和汉字和阿拉伯书数字和空格,只留下回车换行\r 回车 \n 换行
SELECT a,regexp_replace(a,'[[:blank:]]','') FROM test3;--匹配空格和tab,不匹配回车换行
select a,regexp_replace(a,'[^[:digit:]]','') from test3; --任何非数字,替换成空(只留下数字)
SELECT a,regexp_replace(a,'(\d)','') FROM test3; --任意十进制数字,等价于[0-9],替换成空
SELECT a,regexp_replace(a,'(\D)','') FROM test3; --任意非十进制数字,等价于[^0-9],替换成空(只留下数值)
SELECT a,regexp_replace(a,'(\w)','') FROM test3; --任意单词字符,等价于[a-zA-Z0-9]和汉字,替换成空(可以查看数据有哪些特殊符号)
SELECT a,regexp_replace(a,'(\W)','') FROM test3; --任意非单词字符,等价于[^a-zA-Z0-9]和汉字,(特殊符号、空格)替换成空
SELECT a,regexp_replace(a,'(\s)','') FROM test3; --匹配任意空白字符,等价于[\f\n\r\t\v],(空格、回车换行)替换成空
SELECT a,regexp_replace(a,'(\S)','') FROM test3; --匹配任意非空白字符,等价于[^\f\n\r\t\v],替换成空(只留下空白字符:空格)
  • 官网示例
--创建员工表
create table employees(
phone_number number(10)
);
--insert语句
insert into employees(phone_number)values(5151234567);
insert into employees(phone_number)values(5151234568);
insert into employees(phone_number)values(5151234569);
insert into employees(phone_number)values(5901234567);
commit;
--下面的示例进行检查phone_number,寻找模式xxx。xxx. xxxx. oracle 使用 ( xxx) xxx-重新格式化此模式xxxx。
select regexp_replace(phone_number,
'([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{4})',
'(\1) \2-\3') "REGEXP_REPLACE"
from employees;
/*REGEXP_REPLACE -------------------------------------------------------------------------------- (515) 123-4567 (515) 123-4568 (515) 123-4569 (590) 423-4567 . . .*/
--以下示例检查country_name. oracle 在字符串中的每个非空字符后放置一个空格
select
regexp_replace('Argentina', '(.)', '\1 ') "REGEXP_REPLACE"
from dual;
--result: a r g e n t i n a 
--以下示例检查字符串,查找两个或多个空格。oracle 将每次出现的两个或多个空格替换为一个空格。
select
regexp_replace('500 Oracle Parkway, Redwood Shores, CA',
'( ){2,}', ' ') "REGEXP_REPLACE"
from dual;
--result: 500 oracle parkway, redwood shores, ca
--格式化手机号,将+86 13811112222转换为(+86)138-1111-2222,’+'在正则里有定义,需转义
select regexp_replace('+86 13811112222','(\+[0-9]{2})( )([0-9]{3})([0-9]{4})([0-9]{4})','(\1)\3-\4-\5') as new_str from dual;
--result: (+86)138-1111-2222
--匹配的是'11';1 起始位置;0 替换所有匹配项(如果指定1,表示第一次出现的位置);x:忽略正则表达式中的空白字符;
select regexp_replace('11 1 1 11','1 1','00',1,0,'x') from dual;
--00 1 1 00
--通过n参数使 '.' 可以匹配换行符,实现合并
select regexp_replace('a b c ','([a-z])(.)','\1',1,0,'n') from dual;
--result:abc

regexp_replace学习网址
官网

  • REGEXP_COUNT语法

REGEXP_COUNT ( source_char, pattern , position , match_param)
source_char:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
position:起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0
match_parameter:匹配选项
i 忽略大小写;
c 区分大小写;
n:允许将句点“.”作为通配符来匹配换行符。如果省略该参数,句点将不匹配换行符;
m:多行模式;
x:忽略空白字符;默认情况下,空白字符与自身匹配;
默认 区分大小写、句点不匹配换行符、源串被看作一行

--\w 任意单词字符,等价于[a-zA-Z0-9]
select regexp_count('welcome','\w')   from dual;
--result: 7
select regexp_count('welcome','w')   from dual;
--result: 1
  • 模式修饰符
模式修饰符 描述
i 用于不区分大小写的匹配
c 用于区分大小写的匹配
m 多行模式,将字符串为多行。默认的正则开始”^“和结束”$”将目标字符串作为单一的一”行”字符。加上m后,那么开始和结束将会指字符串的每一行
n 允许将句点“.”作为通配符来匹配换行符。如果省略改参数,句点将不匹配换行符
x 忽略空白字符。默认情况下,空白字符与自身匹配
默认 区分大小写、句点不匹配换行符、源串被看作一行
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137446.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux 系统下如何进行用户之间的切换

    linux 系统下如何进行用户之间的切换

    2021年10月27日
  • Keil5新建STM32工程(详细图解)[通俗易懂]

    Keil5新建STM32工程(详细图解)[通俗易懂]一、下载ST官方库    首先注册账号登录,然后点击产品、微控制器;如图       接着右侧的工具与软件;嵌入式软件,并选择STM32,如图。 我的是STM32F1系列,选择如图这个   获取软件   然后下载即可。 二、安装keil   不介绍。相信都安装好了。三、准备工作       新建project文件夹,并在里面新建三个文件夹,CMSIS(存放内核函数及启动引导文件)…

  • php getrealpath,java_java 获取路径的各种方法(总结),(1)、request.getRealPath(“/”);//不推 – phpStudy…

    php getrealpath,java_java 获取路径的各种方法(总结),(1)、request.getRealPath(“/”);//不推 – phpStudy…java获取路径的各种方法(总结)(1)、request.getRealPath(“/”);//不推荐使用获取工程的根路径(2)、request.getRealPath(request.getRequestURI());//获取jsp的路径,这个方法比较好用,可以直接在servlet和jsp中使用(3)、request.getSession().getServletContext().getRe…

  • pycharm远程部署_pycharm 远程调试

    pycharm远程部署_pycharm 远程调试在这之前你要确保服务器上已经创建好虚拟环境你本地已经安装好pycharm1创建本地文件远程服务器上已经有一个文件了。现在你在本地创建一个同名文件。服务器上的虚拟环境为DrQA,所以我在本地新建一个DrQA空文件夹。2用pycharm打开空项目3配置服务器的解释器左上角File→Setting→projectxxx→pythoninterpreter点右上角的小齿轮,然后点add选择SSHInterpreter,然后在上边填上服务器的地址、usernam

    2022年10月29日
  • SNMPWALK 命令「建议收藏」

    SNMPWALK 命令「建议收藏」SNMPWALK是一个通过SNMPGET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作。命令行:snmpwalk[选项]agent[oid]选项参数:由于SNMP协议中,不同的协议版本存在不同的参数选项,以下参数按协议分开说明。1.   普通选项a)   –h   显示帮助b)   –v1|2c|3

  • idea怎么集成git(idea中git的使用)

    一、IDEA集成git方法   首先idea集成git我们需要先下载一个小软件,gitbash 地址:https://git-scm.com/downloads 。下载好了之后直接下一步下一步傻瓜试安装。安装好后回在你指定的文件夹下有个git文件夹,文件结构如下:当然如果你对git命令比较熟悉,用这个软件就可以实现所有的git操作了。下面我们来集成进IDEA开发工具。打开I…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号