【MySQL必知必会】第9章:正则表达式搜索

9.1 正则表达式介绍

正则表达式是用来匹配文本的特殊的串(字符集合),并且在所有操作系统、文本编辑器等都支持正则表达式

9.2 使用正则表达式

MySQL用WHERE子句来支持正则表达式检索,并且通过REGEXP(regular expression)来连接检索条件:

#基础用法
SELECT prod_name 
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

#正则通配符
SELECT prod_name 
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;

LIKE和REGEXP之间一个重要差别:

LIKE匹配整个列

  • 如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)

REGEXP在列值内进行匹配

  • 如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。

虽然REGEXP不能匹配整个列值,但是如果借助定位符(^和$)可以起到和LIKE相同的作用

9.3 OR的正则表达式运用

「|」符号的用法

在正则表达式中可以使用「|」符号来表示「或」(OR),即可起到类似于select中OR关键字的用法:

SELECT prod_name
FROm products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
  • 每增加一个「|」符号,就多增加一个检索条件

[]符号的用法

[]内可以用来定义一组字符,它表示是返回当中任何一种情况的字符:

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123]Ton'
#等价于 REGEXP '[1|2|3] Ton'
#等价于 REGEXP '[1-3] Ton'
ORDER BY prod_name;
  • 除了数字之外,[]内还可以定义字母字符,例如[a-z]

9.4 特殊字符匹配

除了匹配一般的字母、数字之外,有时可能还需要匹配某些带有特殊符号的文本,例如「.」等;但是这些字符在正则表达式中可能会有着其他用法,因此对待这些字符时需要格外小心:

SELECT vend_name
FROm vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
  • 其中「\」斜杠表示转义符,但是使用两个转义符的原因是MySQL要求解释一个,正则表达式库解释另外一个,这可能与其他软件有所区别

9.5 匹配多个实例

重复元字符

有时需要对匹配的数目进行更强的控制。例如,需要寻找所有的数,不管数中包含多少数字;或者你可能想寻找一个单词并且还能够适应一个尾 随的s(如果存在),等等;这是就需要用到重复元字符来进行操作:

  • 「*」:表示0个或多个匹配
  • 「+」:表示1个或多个匹配(等于{1,})
  • 「?」:表示0个或1个匹配(等于{0,1})
  • 「{n}」:表示指定数目匹配
  • 「{n,}」:表示大于或等于n
  • 「{n, m}」:表示$n<=i<=m$
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
  • 「\(」和「\)」分别匹配「(」和「)」
  • 「?」匹配stick和sticks(?表示匹配它前面的字符出现0次或1次)

9.6 定位符

如果想匹配特定位置的文本,就需要用到定位符来进行定位:

  • 「^」表示文本开头
  • 「$」表示文本结尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;

「^」有两种用法:一种是来指定字符串的开始,另一种就是在集合中用[和]定义,用来否定该集合,即匹配除了该集合外的条件,^[abc]

你可能感兴趣的:(【MySQL必知必会】第9章:正则表达式搜索)