如何在Mysql中使用Regexp正则表达式

60次阅读
没有评论

共计 6221 个字符,预计需要花费 16 分钟才能阅读完成。

自动写代码机器人,免费开通

本篇文章给大家分享的是有关如何在 Mysql 中使用 Regexp 正则表达式,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

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 .[_].

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

·‘. 匹配任何单个的字符。
· 字符类“[…]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
·“*”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。
如果 REGEXP 模式与被测试值的任何地方匹配,模式就匹配 (这不同于 LIKE 模式匹配,只有与整个值匹配,模式才匹配)。
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。
为了找出以“b”开头的名字,使用“^”匹配名字的开始:
使用正则

SELECT * FROM pet WHERE name REGEXP BINARY‘^b
SELECT * FROM pet WHERE name REGEXP‘fy$
SELECT * FROM pet WHERE name REGEXP‘w
SELECT * FROM pet WHERE name REGEXP‘^…..$
SELECT * FROM pet WHERE name REGEXP‘^.{5}$

今天在应用中遇到了这样的一个问题,

有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2
需要从里面搜索出比如说:第一个逗号前的数字范围为 3 - 5 之间,第三个逗号前的数字的范围为 3 - 5 之间,第 10 个逗号前的数字范围为 3 - 5 之间,其余的都为 1 - 5 之间。。。
则 sql 语句可以这么写:

SELECT * FROM tb WHERE t1 REGEXP ^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%

1. 使用 LIKE 和 NOT LIKE 比较操作符(注意不能使用 = 或!=);
2. 模式默认是忽略大小写的;
3. 允许使用”_”匹配任何单个字符,”%”匹配任意数目字符(包括零字符);

附一些 mysql 正则规则

^ 匹配字符串的开始部分
$ 匹配字符串的结束部分
. 匹配任何字符(包括回车和新行)
a* 匹配 0 或多个 a 字符的任何序列
a+ 匹配 1 个或多个 a 字符的任何序列
a? 匹配 0 个或 1 个 a 字符
de|abc 匹配序列 de 或 abc
(abc)* 匹配序列 adc 的 0 个或者多个实例

{n}、{m,n} {n}或 {m,n} 符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或“部分”)。m 和 n 均为整数。
a* 可被写为 a{0,}
a+ 可被写为 a{1,}
a? 可被写为 a{0,1}

[a-dX] 匹配任何是 a,b,c,d 或者 X 的字符,两个其他字符之间的 – 字符构成一个范围
[^a-dX] 匹配任何不是 a,b,c,d 或者 X 的字符,前面的字符 ^ 是否定的意思

[.characters.] 在括号表达式中(使用[和]), 匹配用于校对元素的字符序列,字符为单个字符或新行等字符名
mysql SELECT‘~ REGEXP‘[[.~.]] – 1
mysql SELECT‘~ REGEXP‘[[.tilde.]] – 1

[=character_ > 在括号表达式中(使用[和]),[=character_ >[[=a=]] 等同于[a(+)],[a+],[a{1,}]

[:character_class:]
在括号表达式中(使用 [和]),[:character_class:] 表示与术语类的所有字符匹配的字符类。

标准的类名称是:

alnum 文字数字字符
alpha 文字字符
blank 空白字符
cntrl 控制字符
digit 数字字符
graph 图形字符
lower 小写文字字符
print 图形或空格字符
punct 标点字符
space 空格、制表符、新行、和回车
upper 大写文字字符
xdigit 十六进制数字字符

[[: :]], [[: :]]

这些标记表示 word 边界。它们分别与 word 的开始和结束匹配。word 是一系列字字符,其前面和后面均没有字字符。字符是 alnum 类中的字母数字字符或下划线(_)。

mysql select‘fang shan zi regexp‘[[: :]]shan[[: :]] – 1
mysql select‘fang shan zi regexp‘[[: :]]fang[[: :]] – 1
mysql select‘fang shans zi regexp‘[[: :]]shan[[: :]] – 0

正则表达式使用特殊字符,应在其前面加上 2 个反斜杠 字符

mysql SELECT 1+2′ REGEXP 1+2′; – 0
mysql SELECT 1+2′ REGEXP 1+2′; – 0
mysql SELECT 1+2′ REGEXP 1\+2′; – 1

MySQL 查寻条件使用正则 regexp

我用的是 Mybatis

t.hobby:条件字段
hobby : 查寻参数,值可以是多个逗号分隔的值:‘阅读, 交友, 围棋

!– t.hobby 的值最初可能是这样:  吃,  喝, 嫖, 赌   , 抽, 坑, 蒙, 拐, 骗, 偷 每个词的两边有空格不规则 —
!– 下面逐步演示 —
if test= hobby!=null and hobby!=
 concat(, ,REPLACE (t.hobby, ,), , ) regexp concat(,( ,replace(#{hobby}, , , | ), ), )
/if
!– 表字段 t.hobby 取出值 —
if test= hobby!=null and hobby!=
 concat(, ,REPLACE (   吃,  喝, 嫖, 赌   , 抽, 坑, 蒙, 拐, 骗, 偷 , ,), , ) regexp concat(,( ,replace(#{hobby}, , , | ), ), )
/if
!– 表字段值处理后,去掉了多余的空格 —
if test= hobby!=null and hobby!=
 concat(, , 吃, 喝, 嫖, 赌, 抽, 坑, 蒙, 拐, 骗, 偷 , ,) regexp concat(,( ,replace(#{hobby}, , , | ), ), )
/if
!– concat 后得到一个字符串,首尾加上了逗号 —
if test= hobby!=null and hobby!=
  , 吃, 喝, 嫖, 赌, 抽, 坑, 蒙, 拐, 骗, 偷, regexp concat(,( ,replace(#{hobby}, , , | ), ), )
/if
!– 取出参数 #{hobby} 的值 —
if test= hobby!=null and hobby!=
  , 吃, 喝, 嫖, 赌, 抽, 坑, 蒙, 拐, 骗, 偷, regexp concat(,( ,replace( 吃, 喝, 嫖, 嫖 , , , |), ), )
/if
!– 把逗号换成 |  —
if test= hobby!=null and hobby!=
  , 吃, 喝, 嫖, 赌, 抽, 坑, 蒙, 拐, 骗, 偷, regexp concat(,( , 吃 | 喝 | 嫖 | 嫖 ,), )
/if
!– concat 后得到一个字符串,首尾加上了括号,逗号   —
if test= hobby!=null and hobby!=
  , 吃, 喝, 嫖, 赌, 抽, 坑, 蒙, 拐, 骗, 偷, regexp ,(吃 | 喝 | 嫖 | 嫖), !– 纪念于谦老师不赌的美德 —
/if

得到结果是 1 作为条件就是真了。

复杂的过程主要是用来处理查寻条件。得到符合要求的正则作条件就 ok 了
但个人觉得,更理想的方式是:
被查寻字段在当初存入数据时就处理好格式:吃, 喝, 嫖, 赌, 抽, 坑, 蒙, 拐, 骗, 偷
查寻条件可以处理好传进来:,(吃 | 喝 | 嫖 | 嫖),
那么一个查寻就可以简化成这样

if test= hobby!=null and hobby!=
 concat(, , t.hobby , ,) regexp #{hobby}
/if

以上就是如何在 Mysql 中使用 Regexp 正则表达式,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计6221字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)