首页 > 数据库 >MySQL正则表达式

MySQL正则表达式

时间:2024-07-30 23:08:25浏览次数:12  
标签:匹配 正则表达式 select emp MySQL regexp where SELECT

004-正则表达式

MySQL利用REGEXP命令提供给用户扩展的正则表达式功能,熟悉掌握REGEXP的功能可以使模式匹配工作事半功倍。

表达式     说明
^       字符串开始处进行匹配(以“后面字符串”开始匹配字符)
$       字符串结尾处进行匹配(以“前面字符串”结尾匹配字符)
.       匹配任意单个字符,包括换行符。
[…]     匹配括号内的任意字符
[^…]    不匹配出括号内的任意字符
a*      匹配零个或多个a(包括空串)同a?
a?      匹配零个或多个a(包括空串)同a*
a+      匹配1个或多个a(不包括空串)

a1|a2   匹配a1或a2
a{m}    匹配M个a
a{m,}   匹配m个或更多个a
a{m,n}  匹配m到n个a
a(,n)   匹配0到n个a,已经放弃。
(…)     将模式元素组成单一元素


示例:不区分大小写。跟字符集相关。collation_connection   utf8mb4_0900_ai_ci   ci不区分大小写。
加上binary表示改表达式强制区分大小写。

(1)以..开头,以..结尾

SELECT * FROM `emp` where ename rlike '^A';
等同
SELECT * FROM `emp` where ename regexp '^A';
等同
SELECT * FROM `emp` where ename regexp '^a';

^,$,. 在字符串开始处匹配字符,匹配成功返回1,否则为0.

select 'asdf' regexp 'f$';
select 'asdf' regexp '^a';
select 'asdf' regexp 'a.';
select 'asdf' regexp '.';

(2)匹配单个字符。
. 匹配任意单个字符。binary使用二进制匹配,区分大小写

SELECT * FROM `emp` where ename regexp '.c';

SELECT * FROM `emp` where ename regexp binary 'c.';

(3)匹配指定任意字符,排除指定字符串。

[…] 匹配中间任一字符,[^…] 不匹配任一字符。两个其他字符之间的-字符形成一个范围

SELECT * FROM `emp` where ename regexp '[3f]';

匹配到返回1,未匹配到返回0.
select 'er11' regexp '[r1213]';

SELECT * FROM `emp` where ename regexp '[a-d]';

注意:[^..] 这里除了[]中的串,其他都匹配出来,[]中的字符串是完整匹配,而不是任一字符。
SELECT * FROM `emp` where ename regexp '[^ALLEN]';

匹配多个:
SELECT * FROM `emp` where ename regexp '[^ALLEN|WARD]';

SELECT * FROM `emp` where ename regexp '[^a-d]';  这里只排除了一个字符串"abcd",只有没有这样序列的字符串,都检索出来。

但是:
select 'asdf' regexp '[^sdf]';   1 没有匹配到,返回1,
select 'asdf' regexp '[^asdf]';    0 匹配了,所以返回0.

(4)任意匹配
a* = a? 匹配任意各个任意字符(包括0个,空串)。
a+      匹配1个或多个,不包括空串

select 'asdf' regexp 'a?';
select 'asdf' regexp 'a*';
select 'asdf' regexp 'a+';
三个一致。

select 'a sdf' regexp 'a?s';
select 'a\nsdf' regexp 'a*s';
select 'a sdf' regexp 'a+s';

最后一个没匹配上。它只能匹配as,aas,aaas....
而上面2个,能匹配a s,  s,adbfs,dbfs.....

SELECT * FROM `emp` where ename regexp 'c*t';
能够匹配c..t的,也能匹配带t字符串。

SELECT * FROM `emp` where ename regexp 'c*';
能匹配到全部14条,因为c*表示0个或多个,也就是说没有c也可以匹配,= 直接匹配*或者?

换成SELECT * FROM `emp` where ename regexp binary 'c.';
带c都能匹配,只有c结尾的无法匹配。
select 'a sdfc' regexp 'c.';

(5)指定匹配字符个数。

select 'aaaffc' regexp 'a{2}';          1
select 'aaaffc' regexp 'a{3}';          1
select 'aaaffc' regexp 'a{1,}';          1
select 'aaaffc' regexp 'a{,3}';          语法错误
select 'aaaffc' regexp 'a{1,3}';          1

a{1,3}表示1-3个,包含边界值。相当于>=1 <=3.

a*  a? 可以写成 a{0,}
a+  可以写成 a{1,}

SELECT * FROM `emp` where ename regexp 't{2}';


(…)将模式元素组成单一元素
将括号里面的字符做一个整体进行匹配,如果多个字符,只匹配上一个,返回0,必须都匹配上,也就是说匹配括号内的字符串。

当子串在字符串的开头或结尾的时候。(...)可以改写成:

SELECT * FROM `emp` where ename regexp '^sc';       SCOTT
SELECT * FROM `emp` where ename regexp 'tt$';       SCOTT

当一个字符串,需要匹配的子串,在中间,也可以这样。

SELECT * FROM `emp` where ename regexp 'co';        SCOTT

正例:
SELECT 'pihhhpi' REGEXP '^(pi)*$';          0
SELECT 'pipi' REGEXP '^(pi)*$';             1
SELECT 'pi' REGEXP '^(pi)*$';               1
SELECT 'pip' REGEXP '^(pi)*$';              0


^(pi)*$
表示,以pi为整体 开头,*不再表示任意个任意字符,而是匹配1+个pi,以pi结尾。
可以改写成: ^(pi){1,}(pi)$   语法稍显麻烦。而且无法匹配"pi" 这个单字符串。

因此这就是(...)的适用场景。


=============================正则表达式在日常中的应用 ===============================

(1)过滤163邮箱

例如我们需要过滤出,使用163邮箱的用户信息。
同时 要求: @和#都是合法的邮件用户名与域名分隔符。yy#163,com 也算163的邮箱
        ,和.都是合法的域名与域名后缀分隔符。yy@163,com 也算163的邮箱

方案1:like
select * from user_info where email like '%@163.com' or like '%@163,com' or like '%#163,com' or like '%#163.com'

方案二:正则
select * from user_info where email regexp '.*[@#]163[.,]com$'


(2)随机抽取test表数据的样本

oracle中用DBMS_RANDOM,MySQL中使用RAND()函数来实现,可以利用这个函数与order by 一起使用,来完成随机抽取某些行的功能。其实就是order by rand()能够把数据随机排序。

 

标签:匹配,正则表达式,select,emp,MySQL,regexp,where,SELECT
From: https://www.cnblogs.com/rcsy/p/18333525

相关文章

  • MySQL的HINT用法
     一、mysql常用的hint 对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法。同样,在mysql里,也有类似的hint功能。下面介绍一些常用的。  强制索引FORCEINDEX SELECT*FROMTABLE1FORCEINDEX(FIELD1)…以上的SQL语句只使......
  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • mysql工具简介
    MySQL常用工具mysqladmin  创建删除数据库,授权等。mysqlbinlog 从二进制日志读取语句的工具,mysqlcheck  检查,修复,分析以及优化表的表维护程序mysqldump  将MySQL数据库转储到一个文件。mysqlimport 使用loaddatainfile将文本文件导入相关表的客户程序。mysq......
  • mysql测试库-emp-dept
    003-MySQL版本测试库-emp-dept初始化DROPTABLEIFEXISTS`bonus`;CREATETABLE`bonus`( `ename`varchar(10)DEFAULTNULL, `job`varchar(9)DEFAULTNULL, `sal`int(11)DEFAULTNULL, `comm`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;--......
  • MySQL基础
    MySQL默认情况下在查询和操作数据库对象时,不区分大小写:对于表名、列名和数据库名,MySQL不会区分大小写。例如,"mytable"、"MyTable"和"MYTABLE"都被视为相同的表名。在SQL语句中,关键字和函数名不区分大小写。例如,"SELECT"、"select"和"Select"都是等效的。在默认情况下,MySQ......
  • [Mysql-事务]
    目录事务是什么:简单事务实现举例:事务ACID原则:事务隔离性事务的隔离级别:锁分类:事务是什么:        事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。简单事务实现举例:        就像现......
  • Java正则表达式
    基本规则要点Test //131123456781[3-9]\\d{9} Stringregex1="1[3-9]\\d{9}"; System.out.println("13154654456".matches(regex1));//true System.out.println("03154654456".matches(regex1));//false System.out.printl......
  • 【MySQL(锁篇)】深入MySQL锁机制:从全局到行级,解锁数据库性能瓶颈(上:MySQL锁介绍、表级锁
    文章目录MySQL(锁篇)-全局锁、表锁、行锁(记录锁、间隙锁、临键锁、插入意向锁)、意向锁、SQL加锁分析、死锁产生原因与排查一条Update语句MySQL锁介绍1锁分类2全局锁表级锁1什么是表级锁?2表读锁、写锁2.1表锁相关命令2.2表锁演示3元数据锁3.1元数据锁介绍3.2元......
  • 【MySQL(锁篇)】深入MySQL锁机制:从全局到行级,解锁数据库性能瓶颈(下:行锁分析实战、死锁原
    文章目录MySQL(锁篇)-全局锁、表锁、行锁(记录锁、间隙锁、临键锁、插入意向锁)、意向锁、SQL加锁分析、死锁产生原因与排查行锁分析实战1读已提交RC1.1组合一:ID是主键1.2组合二:ID唯一索引1.3组合三:ID非唯一索引1.4组合四:ID无索引2可重复读RR2.1组合五:ID主键2.2组......
  • 正则表达式小记
    转义字符在正则表达式中,某些字符具有特殊的含义,它们被称为元字符或特殊字符。当你希望这些特殊字符按照字面意义匹配文本时,就需要使用转义字符(通常是反斜杠\)来“取消”它们的特殊含义。以下是正则表达式中需要转义的常见特殊字符:反斜杠用于转义其他特殊字符或创建预定义字符......