MySQL正则表达式
使用正则表达式明显是为了那些需要更复杂的控制数据过滤的时候。
基本字符匹配
REGEXP
看起来和LIKE
关键字很像,REGEXP
告诉MySQL,后面所跟的东西作为正则表达式处理。
NOTE:如果被匹配的文本在列值中出现,LIKE
将不会找到它(除非使用通配符);而REGEXP
如果找到被匹配的文本在列值内出现,就会返回这一行。
e.g.
下面的语句会检索所有包含文本'bear'的行。
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP 'bear'
ORDER BY prod_name;复制

MySQL中的正则表达式不区分大小写,未区分大小写,可以使用BINARY
关键字
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP BINARY 'bear'
ORDER BY prod_name;复制
OR匹配
搜索两个串之一,看下面例子就懂了。
e.g.
下面的语句找出所有包含bear或者doll的产品。正则表达式bear|doll,I为正则表达式的OR操作符,表示匹配其中之一。
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP 'bear|doll'
ORDER BY prod_name;复制
匹配特定字符
如果我们只想匹配特定的字符,可以通过一组用[]
括起来的字符完成。
e.g.
正则表达式中的[28]
表示匹配2或8。
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1[28] inch'
ORDER BY prod_name;复制

匹配范围
这个也很简单,就是用-
来定义一个范围。
e.g.
下面的[1-8]
表示匹配数字1到8。
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-8] inch'
ORDER BY prod_name;复制

匹配特殊字符
匹配特殊字符,必须用\\
为前导。\\.
表示查找.,\\-
表示查找-
NOTE:
.
会匹配任意字符,因此所有行会显示出来,\\就像别的语言的转义
e.g.
下面的[1-8]表示匹配数字1到8。
输入
SELECT vend_name, vend_address
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;复制

匹配多个实例
之前的匹配都是单次出现,但有时我们需要对匹配的数目进行更强的控制,比如一个数字出现多少次,单词末尾是否带s(复数)
e.g.
[0-9]会匹配任意数字,bears?会匹配bear或bears,?
匹配它前面的任何字符出现0次或1次。
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1[0-9] inch teddy bears?'
ORDER BY prod_name;复制

其他的重复元字符还有:
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配 |
? | 0个或1个匹配 |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
定位符
之前的匹配都是本文的任意位置,使用定位符可以匹配特定位置的文本
e.g.
^r
会匹配文本开头为r或R的行。
输入
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^r'
ORDER BY prod_name;复制

更多定位元字符见下面表格
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[: | 词的开始 |
[[:>:]] | 词的结尾 |
果然正则表达式在哪个语言都很麻烦啊,嗯,这篇就这样吧,BYE-BYE!!
往期回顾
