Mysql中正则表达式Regexp常见用法


本文整理自网络,侵删。

Mysql中Regexp常见用法

模糊匹配,包含特定字符串
# 查找content字段中包含“车友俱乐部”的记录

select * from club_content where content regexp '车友俱乐部'

# 此时的regexp与like的以下用法是等同的

select * from club_content where content like '%车友俱乐部%'

模糊匹配,以特定字符串开头
# 查找content字段中以“车友”开头的记录

select * from club_content where content regexp '^车友'

# 此时的regexp与like的以下用法是等同的

select * from club_content where content like '车友%'

模糊匹配,以特定字符串结尾
# 查找content字段中以“车友”结尾的记录

select * from club_content where content regexp '车友$'

# 此时的regexp与like的以下用法是等同的

select * from club_content where content like '%车友'

模糊匹配,或关系
# 查找content字段中包含“心得”、“分享”或“技术贴”

select * from club_content where content REGEXP '心得|分享|技术贴'

模糊匹配,不包含单个字符
# 查找content字段中不包含“车”字、“友”字的记录

select * from club_content where content REGEXP [^车友]

这个结果跑出来一看大吃一惊,竟然把所有记录给跑出来,这是为什么呢?
因为一旦加了这个方括号"[]",它就把里面的内容拆成单个的字符再匹配,它会逐个字符去匹配判断是不是等于“车”,或者是不是等于“友“,返回的结果是一组0、1的逻辑值。

如果想匹配不包含特定字符串,该怎么实现呢?

模糊匹配,不包含特定字符串
# 查找content字段不包含“车友”字符串的记录

select * from club_content where content not REGEXP '车友'

MySql REGEXP运算符匹配字符串

1 ^ 匹配以该字符后面的字符开头的字符串
举个例子: REGEXP ‘^x' 表示匹配以x开头的字符
2 $匹配以该字符前面的字符结尾的字符串
举个例子: REGEXP ‘y$' 表示匹配以y结尾的字符
3 .匹配任意一个字符
4 […]匹配在方括号中的任意一个字符。
如: [1-9] 匹配1到9的数字, [abc]匹配其中任意一个
5 *匹配零个或多个在它前面的字符
如: x* 匹配任何数量的x字符

mysql 如何判断 "字符串" 是否为 "数字"

这个问题有点怪 ,但很多时候我们会以字符串的形式存储数字 , 反过来我们用字符串进行数学运算时, 好像也不会出错 . 除非 , 用作数学运算的字符串不能转换成数字 .
但是我们改如何判断字符串是否能转换成数字呢 ?

采用mysql的 REGEXP运算符 . 怎么用?

{String} REGEXP '[^0-9.]'

前面的字符串是我们要做判断的, 后面的字符串是mysql的正则表达式,意思是 匹配不是数字或者小数点的字符。

如果String中含有不是0-9之间的数字或者是小数点时,返回true ,反之则返回false。

比如说 :

select ('123a' REGEXP '[^0-9.]'); --‘123a'中含有字符'a' 输出结果为1 mysql中常量true输出为1 false输出为0

注意:如果字符串中有空格,也会匹配到正则表达式,返回1。如果是要去掉两端的空格,就要将判断的字符串,就要对字符串使用 trim()函数了。

这个只是REGEXP操作符的简单应用,REGEXP的详细应用请参考官方文档。 

MySQL 正则表达式

在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。

MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

如果您了解PHP或Perl,那么操作起来就非常简单,因为MySQL的正则表达式匹配与这些脚本的类似。

下表中的正则模式可应用于 REGEXP 操作符中。

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

实例

了解以上的正则需求后,我们就可以根据自己的需求来编写带有正则表达式的SQL语句。以下我们将列出几个小实例(表名:person_tbl )来加深我们的理解:

查找name字段中以'st'为开头的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

mysql正则REGEXP学习练习笔记

REGEXP在mysql是用来执行正则表达式的一个函数,像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。

MySql用户手册建议,在构造简单查询时,仍使用通配符。

如:

Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];

但在一些特殊查询中,不用正则表达式是不行的。MYSQL提供的正则表达式WHERE谓词有三个,分别是:

REGEXP, RLIKE, NOT RLIKE

用这三个替换原有的LIKE谓词,后面即可以跟正则表达式。
例如要查询字段中含有“_”的数据,则要用以下查询语句:

SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

扩展正则表达式的一些字符是:

阅读剩余部分

相关阅读 >>

navicat和sql的关系

sql注入原理介绍

mysql中的事件调度基础学习教程

sql查询中group by的含义是什么

浅谈数据库优化方案

sql和access哪个好?

sql行转列和列转行代码详解

sql server 开窗函数 over()代替游标的使用详解

php操作sql server数据库实现表的改查与统计

详解android数据存储之sqlcipher数据库加密

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...