当前位置:   article > 正文

MySql011——检索数据:过滤数据(使用正则表达式)_正则表达式过滤数据的关键字

正则表达式过滤数据的关键字

前提:使用《MySql006——检索数据:基础select语句(使用products表、查询单列、多列、所有列、DISTINCT去除重复行、LIMIT限制返回结果的行数、了解完全限定)》中创建的products表
在这里插入图片描述

一、正则表达式介绍

关于正则表达式的介绍大家可以看我的这一篇博客《Java038——正则表达式》,这里就不再累赘。

二、使用MySQL正则表达式

2.1、基本字符匹配

  1. 检索列prod_name包含文本1000的所有行
SELECT 
    prod_name
FROM
    study.products
WHERE
    prod_name REGEXP '1000'
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句(MySql010——检索数据:过滤数据(使用LIKE操作符结合%、_通配符))。它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。

  1. 检索列prod_name以000结尾的所有行
SELECT 
    prod_name
FROM
    study.products
WHERE
    prod_name REGEXP '.000'
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

匹配不区分大小写 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'	--检索prod_name 包含1000或2000的记录
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
上面语句中使用了正则表达式1000|2000。|为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。

2.3、匹配几个字符之一

如果你只想匹配特定的字符,可通过指定一组用[和]括起来的字符来完成

SELECT 
    prod_name
FROM
    study.products
WHERE
    prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
这里使用正则表达式[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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

上面表示检索列prod_name中包含.的行。

2.6、匹配字符类

   类					说 明
=====================================================================
[:alnum:] 		任意字母和数字(同[a-zA-Z0-9][:alpha:] 		任意字符(同[a-zA-Z][:blank:] 		空格和制表(同[\\t][:cntrl:] 		ASCII控制字符(ASCII 031127[: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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.7、匹配多个实例

元字符 				说明
=====================================================================
* 				0个或多个匹配
+ 				1个或多个匹配(等于{1,})
? 				0个或1个匹配(等于{0,1})
{n} 			指定数目的匹配
{n,} 			不少于指定数目的匹配
{n,m} 			匹配数目的范围(m不超过255
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

实例1、

SELECT 
    prod_name
FROM
    study.products
WHERE
    prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
正则表达式\\([0-9] sticks?\\)需要解说一下。\\(匹配(,[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\\)匹配)

实例2、
匹配连在一起的4位数字

SELECT 
    prod_name
FROM
    study.products
WHERE
    prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
如前所述,[: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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.8、定位符

目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用如下列出的定位符。

元字符 		说 明
=============================
^ 			文本的开始
$ 			文本的结尾
[[:<:]] 	词的开始
[[:>:]] 	词的结尾
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

例如,如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符,如下所示:

SELECT 
    prod_name
FROM
    study.products
WHERE
    prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。没有^,则还要多检索出4个别的行(那些中间有数字的行)。

与君共享

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/835878

推荐阅读
相关标签