前提:使用《MySql006——检索数据:基础select语句》中创建的products表
一、正则表达式介绍
关于正则表达式的介绍大家可以看我的这一篇博客《Java038——正则表达式》,这里就不再累赘。
二、使用MySQL正则表达式
2.1、基本字符匹配
- 检索列prod_name包含文本1000的所有行
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '1000'
ORDER BY prod_name;
除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句(MySql010——检索数据:过滤数据(使用LIKE操作符结合%、_通配符))。它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。
- 检索列prod_name以000结尾的所有行
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '.000'
ORDER BY prod_name;
匹配不区分大小写 MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字,如WHERE prod_name REGEXP BINARY ‘JetPack .000’。
2.2、进行OR匹配
为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '1000|2000'
ORDER BY prod_name;
上面语句中使用了正则表达式1000|2000。|为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。
2.3、匹配几个字符之一
如果你只想匹配特定的字符,可通过指定一组用[和]括起来的字符来完成
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
1、这里,使用了正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回(没有3 ton)
2、正如所见,[]是另一种形式的OR语句。事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写,也可以使用后者。但是,需要用[]来定义OR语句查找什么。
2.4、匹配范围
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
这里使用正则表达式[1-5] Ton。[1-5]定义了一个范围,这个表达式意思是匹配1到5,因此返回3个匹配行。
2.5、匹配特殊字符
为了匹配特殊字符,必须用\为前导。\-表示查找-
,\.表示查找.
;其实就是Java中的特殊字符的转义。
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '\\.'
ORDER BY prod_name;
上面表示检索列prod_name中包含.
的行。
2.6、匹配字符类
类 说 明
=====================================================================
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\\t])
[:cntrl:] ASCII控制字符(ASCII 0到31和127)
[:digit:] 任意数字(同[0-9])
[:graph:] 与[:print:]相同,但不包括空格
[:lower:] 任意小写字母(同[a-z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])
[:upper:] 任意大写字母(同[A-Z])
[:xdigit:] 任意十六进制数字(同[a-fA-F0-9])
2.7、匹配多个实例
元字符 说明
=====================================================================
* 0个或多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
实例1、
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
正则表达式\([0-9] sticks?\)需要解说一下。\(匹配),[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\)匹配)。没有?,匹配stick和sticks会非常困难。
实例2、
匹配连在一起的4位数字
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
如前所述,[:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切地要求它前面的字符(任意数字)出现4次,所以
[[:digit:]]{4}匹配连在一起的任意4位数字。需要注意的是,在使用正则表达式时,编写某个特殊的表达式几乎总是有不止一种方法。上面的例子也可以如下编写:
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '[0-9][0-9][0-9][0-9]'
ORDER BY prod_name;
2.8、定位符
目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用如下列出的定位符。
元字符 说 明
=============================
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
例如,如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\.](或[[:digit:]\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符,如下所示:
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
^
匹配串的开始。因此,^[0-9\\.]
只在.或任意数字为串中第一个字符时才匹配它们。没有^
,则还要多检索出4个别的行(那些中间有数字的行)。
与君共享
👉👉👉👉👉最后,有兴趣的小伙伴可以点击下面链接,这里有我整理的MySQL学习博客内容,谢谢~ 🌹🌹🌹🌹🌹
《MySQL数据库学习》