第九章 用正则表达式进行搜索

注:一个数据库小白的成长之路

正则表达式:用来匹配文本的特殊的串(字符集合)

1.基本字符匹配

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

检索列prod_name中包含文本1000的所有行

2.进行OR匹配

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;

检索列prod_name中包含文本1000或2000的所有行。注意,这里可以使用多次|,例如'1000|2000|3000'表示匹配文本1000或2000或3000。

3.匹配几个字符之一

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;

[123]表示匹配1或2或3

4.匹配范围

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;

即将[12345]简化为[1-5]

5.匹配特殊字符

SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;

为匹配特殊字符,例如.、|、[]等,必须使用\\作为前导。此外,\\也用来引用元字符。

元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表

6.匹配字符类

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:digit:] 任意数字(同[0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:lower:] 任意小写字母(同[a-z])
[:upper:] 任意大写字母(同[A-Z])

7.匹配多个实例

元字符 说明
* 0个或多个匹配
+ 1个或多个匹配(同{1, })
? 0个或1个匹配(同{0, 1})
{n} 指定数目的匹配
{n, } 不少于指定数目的匹配
{n, m} 匹配数目的范围(m不超过255)

下面为两个例子:

SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;

这里sticks?匹配stick和sticks(s后的?使得s可选,因为?匹配它前面的任何字符的0次或1次出现)

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;

[[:digit:]]{4}表示匹配连在一起的任意4位数字

8.定位符

元字符 说明
^ 文本的开始
$ 文本的结尾
[[:<::]] 词的开始
[[:>::]] 词的结尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;

^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。

注意

  • .是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符。
  • 为区分大小写,可以使用BINARY关键字,例如WHERE prod_name REGEXP BINARY 'JetPack .000
  • [^123]表示匹配除字符1或2或3的任意其他东西,而^[123]匹配首位是1或2或3的字符串。
  • LIKE与REGEXP的不同之处在于LIKE匹配整个串而REGEXP匹配子串。但是利用定位符,用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE相同。
  • SELECT语句可以用来测试正则表达式,REGEXP检查总是返回0(没有匹配)或1(匹配),例如SELECT 'hello' REGEXP '[0-9]';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容