mysql 正则表达式的匹配

时间:2021-02-14 05:38:04

mysql 正则表达式的匹配

基本字符匹配

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'

. 表示匹配任意一个字符

SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;

like 和 regexp 的区别,like匹配整个字符串,regexp 匹配子串

SELECT prod_name
FROM products
WHERE prod_name LIKE '1000' # 不会有记录返回
ORDER BY prod_name
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000' # 返回一个记录
ORDER BY prod_name;

mysql 中的正则表达式匹配不区分大小写

#为了区分大小写可以用 binary 关键字
#如果 改 'JetPack .000' 为 'jetPack .000'就不会有返回
SELECT prod_name
FROM products
WHERE prod_name REGEXP BINARY 'JetPack .000'

or 匹配

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

匹配几个字符之一

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


prod_name
-------------
1 ton anvil
2 ton anvil
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 Ton'
ORDER BY prod_name;


prod_name
---------------
1 ton anvil
2 ton anvil
JetPack 1000
JetPack 2000
TNT (1 stick)

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


prod_name
--------------
.5 ton anvil
1 ton anvil
2 ton anvil

[^12]匹配除这些字符之外的东西

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


prod_name
--------------
.5 ton anvil

匹配范围 [0-3] [a-z]

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


prod_name
--------------
.5 ton anvil
1 ton anvil
2 ton anvil

匹配特殊字符串

\\.
\\-
\\[
\\]
换页 \\f
换行 \\n
回车 \\r
制表 \\t
纵向制表 \\v
使用两个斜杠的原因在于:
一个给 mysql 解析,一个给正则表达式库解析
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\...Ton'
ORDER BY prod_name ;

字符类

[:alnum:]
[:alpha:]
[:digit:]
[:lower:]
[:upper:]
等等

匹配多个实例 – 重复元字符

*    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 ;


prod_name
----------------
TNT (1 stick)
TNT (5 sticks)
# 匹配连在一起的四位数字
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name ;


prod_name
--------------
JetPack 1000
JetPack 2000

定位符 – 匹配字符串特定位置上的信息

^    文本的开始
$ 文本的结束
[[:<:]] 词的开始
[[:>:]] 词的结束
#找出一个以数字或者小数点开头的字符串
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;


prod_name
--------------
.5 ton anvil
1 ton anvil
2 ton anvil
# 注意:^的双重用途 ,^ 有两种用法。
# 在集合中用来否定集合,或者在字符串的开始处来
# 声明以某某开头
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000$' # like 1000 == regexp '^1000$'
ORDER BY prod_name ;


prod_name
--------------
JetPack 1000

简单正则表达式的测试方法

# 返回 0,表示不匹配,返回 1,表示匹配
SELECT 'hello' REGEXP '[0-9]';
SELECT 'hel123' REGEXP '[0-9]';