文章目录
一、介绍
二、格式
三、操作
3.1查询所有以“海”开头的商品
3.2查询所有以“水”结尾的商品
3.3匹配除\n外的任意单个字符
3.4匹配括号内的任意单个字符
3.5[^...]取反
3.6匹配0个或多个
3.7匹配1个或者多个
3.8匹配0个或者1个
3.9匹配a1或者a2
3.10匹配m个a
3.11匹配m个或者更多个a
3.12匹配m个到n个,包含m和n
3.13(abc)作为一个整体
一、介绍
正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。
二、格式
| 模式 | 描述 |
| ^ | 匹配输入字符串的开始位置 |
| $ | 匹配输入字符串的结束位置 |
| . | 匹配除"\n"之外的任何单个字符。 |
| [...] | 字符集合。匹配所包含的任意一个字符。例如,'[abc]'可以匹配"plain"中的'p' |
| [^...] | 负值字符集合。匹配未包含的任意字符。例如,'[^abc]'可以匹配"plain"中的'p'。 |
| p1lp2lp3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配"zood" 或"food"。 |
| * | 匹配前面的子表达式零次或多次。例如,zo*能匹配"z"以及"zoo"。*等价于{0,}。 |
| + | 匹配前面的子表达式一次或多次。例如,'zo+'能匹配"zo"以及"zoo",但不能匹配"z"。+等价于 {1,}。 |
| {n} | n是一个非负整数。匹配确定的n次。例如,o{2}不能匹配"Bob"中的'o’,但是能匹配"food" 中的两个。。 |
| {n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。 |
三、操作
3.1查询所有以“海”开头的商品
-- 正则表达式
-- ^在字符串开始处进行匹配
SELECT 'abc' REGEXP '^a'; -- 1
select *from product where pname REGEXP '^海';
3.2查询所有以“水”结尾的商品
-- $在字符串末尾开始匹配
SELECT'abc' REGEXP 'a$'; -- 0
SELECT'abc'REGEXP 'c$'; -- 1
select * from product where pname REGEXP '水$';
3.3匹配除\n外的任意单个字符
-- 匹配任意单个字符,可以匹配除了换行符之外的任意字符
SELECT 'abc' REGEXP '.b'; -- 1
SELECT 'abc' REGEXP '.c'; -- 1
SELECT 'abc' REGEXP 'a.'; -- 1
3.4匹配括号内的任意单个字符
-- [...]匹配括号内的任意单个字符
-- 正则表达式的任意字符是否在前边的字符串中出现
SELECT 'abc' REGEXP '[xyz]'; -- 0
SELECT 'abc' REGEXP '[xaz]'; -- 1
3.5[^...]取反
-- [^...]注意^符号只有在[]内才是取反的意思,在别的地方都是表示开始处理匹配
SELECT 'a' REGEXP '[^abc]'; -- 0
SELECT 'x' REGEXP '[^abc]'; -- 1
SELECT 'abc' REGEXP '[^a]'; -- 1
3.6匹配0个或多个
-- a*匹配0个或多个a,包括空字符串。可以作为占位符使用,有没有指定字符都可以匹配到数据
-- a*表示a出现0次或者多次
SELECT 'stab' REGEXP '.ta*b'; -- 1
SELECT 'stb' REGEXP '.ta*b'; -- 1
SELECT '' REGEXP 'a*'; -- 1
3.7匹配1个或者多个
-- a+ 匹配1个或者多个a,但是不包括空字符
SELECT 'stab' REGEXP '.ta+b'; -- 1
SELECT 'stb' REGEXP '.ta+b'; -- 0
3.8匹配0个或者1个
-- a? 匹配0个或者1个a
SELECT 'stb' REGEXP '.ta?b'; -- 1
SELECT 'stab' REGEXP '.ta?b'; -- 1
SELECT 'staab' REGEXP '.ta?b'; -- 0
3.9匹配a1或者a2
-- a1|a2 匹配a1或者a2
SELECT 'a' REGEXP 'a|b'; --1
SELECT 'b' REGEXP 'a|b'; --1
-- 是否以a或者b开头
SELECT 'b' REGEXP '^(a|b)'; --1
SELECT 'a' REGEXP '^(a|b)'; --1
SELECT 'c' REGEXP '^(a|b)'; --0
3.10匹配m个a
-- a{m}匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c'; --1
SELECT 'auuuuc' REGEXP 'au{3}c'; --0
3.11匹配m个或者更多个a
-- a{m,}匹配m个或者跟多个a
SELECT 'auuuuc' REGEXP 'au{3,}c'; --1
SELECT 'auuuuc' REGEXP 'au{4,}c'; --1
SELECT 'auuuuc' REGEXP 'au{5,}c'; --0
3.12匹配m个到n个,包含m和n
-- a{m,n}匹配m个到n个,包含m和n
SELECT 'auuuuc' REGEXP 'au{3,5}c'; --1
SELECT 'auuuuc' REGEXP 'au{4,5}c'; --1
SELECT 'auuuuc' REGEXP 'au{5,10}c'; --0
3.13(abc)作为一个整体
-- (abc)
-- abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所以情况
SELECT 'xababy' REGEXP 'x(abab)y'; -- 1
SELECT 'xababy' REGEXP 'x(ab)*y'; -- 1
SELECT 'xababy' REGEXP 'x(ab){1,2}y'; -- 1
SELECT 'xababy' REGEXP 'x(ab){3}y'; -- 0