正则表达式

--常用的普通函数
LIKE  INSTR  SUBSTR  REPLACE

--正则表达式专用的函数
REGEXP_LIKE  REGEXP_INSTR  REGEXP_SUBSTR  REGEXP_REPLACE

select * from emp;

like:
查询名字中包含了A的员工编号和名字
select empno,ename from emp where ename like '%A%';

----------------------------------------------------------------------------

instr(参数1,参数2,参数3,参数4):
参数1:要在哪个列里面去匹配
参数2:在第一个参数中药匹配什么
参数3:从参数1的第几位开始匹配
参数4:匹配参数2的时候,从第几个参数2开始匹配

查询名字里面第一个字母A在第几位
select empno,ename,instr(ename,'A',1) from emp;

在ename中匹配A,从ename的第2位开始查找
select empno,ename,instr(ename,'A',2) from emp;

在ename中匹配字母A,从ename的第1位开始匹配,只匹配ename中的第2个A
select empno,ename,instr(ename,'A',1,2) from emp;
------------------------------------------------------------------

substr:字符串截取
截取ename的值,从第1位开始截取(包含第1位),截取的长度位3位
select ename,substr(ename,1,3) from emp;
----------------------------------------------------------------

replace(参数1,参数2,参数3) : 替换
参数1:要替换的目标字符串;
参数2:目标字符串中的子字符串
参数3:要把子字符替换成什么

替换ename中的所有的字母A,用-来替换A
select ename,replace(ename,'A','-') from emp;

================================================================

使用正则来匹配
正则符号:
^ 表示正则开始
$ 表示正则结束

[0-9]  表示0-9之间的一位数字
\d  也表示一位数字
\w  表示字母数字下划线,长度是一位
\s  表示一位空格
[a-z] 表示一位a-z之间的小写字母
[A-Z] 表示一位大写字母
. 表示任意字符
? 表示匹配长度为0或者1   [0-9]?表示0位或者1位数字
+ 表示匹配1位以上
* 表示任意位数
{m} 表示匹配的长度恰好是m
{m,} 表示匹配的长度是m位以上都可以
{m,n} 表示匹配的长度是m位到n位之间

======================================================

regexp_like:
select * from emp;

update emp set ename='zs345zh' where empno=1001;
commit;

zs345zh
查询名字里面包含了数字的员工的信息
select empno,ename from emp where regexp_like(ename,'^.*[0-9]+.*$');
验证手机号码
select 1 from dual where regexp_like('13912345678','^1[3-9][0-9]{9}$');
select 1 from dual where regexp_like('13912345678','^1[3-9]\d{9}$');
验证邮箱email
xxxx@163.xxx.xx
select 1 from dual where regexp_like('xxxx@163.xxx.xx','^[A-Za-z0-9_]{1,11}@[a-zA-Z0-9]{2,}\.[A-Za-z]{2,4}(\.[a-zA-Z]{2,3})?$');

题目:
1.使用正则,来验证年龄,要求年龄在1-120岁之间
select 1 from dual where regexp_like('130','^([1-9]|[1-9][0-9]|1[0-1][0-9]|120)$');

2.使用正则来验证日期,
    要求:日期格式为2022-01-02
        年份必须是1970-2022年之间;
        月份必须是1-12之间
        日必须是1-31之间
select hiredate from emp where regexp_like
(to_char(hiredate,'yyyy-mm-dd'),
'^((19[7-9][0-9]|200[0-9]|201[0-9]|202[0-2])-(0?[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]))$');

----------------------------------------------------------------------------------------------------------------

regexp_instr
select * from emp;
匹配名字中包含了A或者B或者C的
select empno,ename,regexp_instr(ename,'[ABC]',1,1) from emp;
----------------------------------------------
regexp_substr
从ename中截取,截取内容是从ename中找3位数字的,第三个参数表示从第1位开始匹配,第四个参数表示第1次匹配上的内容
select empno,ename,regexp_substr(ename,'[0-9]{3}',1,1) from emp;
select empno,ename,regexp_substr(ename,'[a-zA-Z]{2}',1,3) from emp;
---------------------------------------------------------------------------------
regexp_replace
把第一个参数中的所有的非数字,都替换成空
SELECT REGEXP_REPLACE('JDSsdHDJSA143214K32JK252^*%','[^0-9]',null) FROM DUAL;

select empno,ename,regexp_replace(ename,'[A-Za-z]','#') from emp;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值