赞
踩
前提:使用《MySql006——检索数据:基础select语句(使用products表、查询单列、多列、所有列、DISTINCT去除重复行、LIMIT限制返回结果的行数、了解完全限定)》中创建的products表
关于正则表达式的介绍大家可以看我的这一篇博客《Java038——正则表达式》,这里就不再累赘。
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '1000'
ORDER BY prod_name;
除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句(MySql010——检索数据:过滤数据(使用LIKE操作符结合%、_通配符))。它告诉MySQL:REGEXP
后所跟的东西作为正则表达式
(与文字正文1000匹配的一个正则表达式)处理。
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’。
为搜索两个串之一(或者为这个串,或者为另一个串),使用|
,如下所示:
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '1000|2000' --检索prod_name 包含1000或2000的记录
ORDER BY prod_name;
上面语句中使用了正则表达式1000|2000。|为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。
如果你只想匹配特定的字符,可通过指定一组用[和]括起来的字符来完成
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语句查找什么。
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个匹配行。
为了匹配特殊字符,必须用\为前导。\\-
表示查找-
,\\.
表示查找.
;其实就是Java中的特殊字符的转义。
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '\\.'
ORDER BY prod_name;
上面表示检索列prod_name中包含
.
的行。
类 说 明
=====================================================================
[: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])
元字符 说明
=====================================================================
* 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次出现
),\\)匹配)
。
实例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;
目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用如下列出的定位符。
元字符 说 明
=============================
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
例如,如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])
不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符
,如下所示:
SELECT
prod_name
FROM
study.products
WHERE
prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
^
匹配串的开始。因此,^[0-9\\.]
只在.或任意数字为串中第一个字符时才匹配它们。没有^
,则还要多检索出4个别的行(那些中间有数字的行)。
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/835878
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。