本节讲解正则表达式。正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。

简单而言,正则表达式是

MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。

模式 描述
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结束位置。
. 匹配除 "\n" 之外的任何单个字符。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 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" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

后面会用具体的例子来演示。

正则表达式的规则特别多,这里简单地熟悉一下方便回找。

-- ^ 匹配输入字符串的开始位置。
-- 判断字符串是不是以a开头
 -- 结果返回1,1表示真
SELECT  'abc' REGEXP '^a';

-- 在具体的表中,放在where部分
# SELECT * from product where pname REGEXP '^海' ;


-- $ 在字符串末尾开始匹配
-- 下面两句话的意思分别是“是否以a结尾”(结果为0)、“是否以c结尾(结果为1)”
SELECT  'abc' REGEXP 'a$';
SELECT  'abc' REGEXP 'c$';
-- 在具体的表中,放在where部分
# SELECT * from product where pname REGEXP '水$' ;


-- . 匹配任意单个字符
-- .点表示单个字符,可以匹配换行符之外的任意字符
SELECT  'abc' REGEXP '.b';  -- 1
SELECT  'abc' REGEXP '.c';  -- 1
SELECT  'abc' REGEXP 'a.';  -- 1
 
-- [...]匹配括号内的任意单个字符
-- 要是[]里的任意字符都没有在前面出现,则返回0
SELECT  'abc' REGEXP '[xyz]';  -- 0
SELECT  'abc' REGEXP '[xaz]';  -- 1

-- [^...] 注意^符合只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
 -- 要是前面的字符串与后面任何一处都不相同,则返回1
SELECT  'a' REGEXP '[^abc]';   -- 0
SELECT  'x' REGEXP '[^abc]';   -- 1
SELECT  'abc' REGEXP '[^a]';   -- 这里需要注意,abc是一个整体
 
-- a* 匹配0个或多个a,包括空字符串。 可以作为占位符使用.有没有指定字符都可以匹配到数据
SELECT 'stab' REGEXP '.ta*b';   -- 1
SELECT 'stb' REGEXP '.ta*b';    -- 1
SELECT '' REGEXP 'a*';          -- 1
 
-- a+  匹配1个或者多个a,但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';  -- 1
SELECT 'stb' REGEXP '.ta+b';   -- 0

-- a?  匹配0个或者1个a
SELECT 'stb' REGEXP '.ta?b';    -- 1
SELECT 'stab' REGEXP '.ta?b';   -- 1
SELECT 'staab' REGEXP '.ta?b';  -- 0
 
-- a1|a2  匹配a1或者a2,
SELECT 'a' REGEXP 'a|b';       -- 1,是否以a或b开头
SELECT 'b' REGEXP 'a|b';       -- 1
SELECT 'b' REGEXP '^(a|b)';    -- 1
SELECT 'a' REGEXP '^(a|b)';    -- 1
SELECT 'c' REGEXP '^(a|b)';    -- 0
 
-- a{m} 匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c';    -- 1
SELECT 'auuuuc' REGEXP 'au{3}c';    -- 0

-- a{m,n} 匹配m到n个a,包含m和n
-- a{m,} 最少出现三次a,最多可以无限次
SELECT 'auuuuc' REGEXP 'au{3,5}c';
SELECT 'auuuuc' REGEXP 'au{4,5}c';
SELECT 'auuuuc' REGEXP 'au{5,10}c';
 
-- (abc) abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y';
SELECT 'xababy' REGEXP 'x(ab)*y';   -- *表示出现0次或者多次
SELECT 'xababy' REGEXP 'x(ab){1,2}y';

声明:内容来源于B站视频《2022黑马程序员最新MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程》,博客内容仅作学习参考使用。



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/mysql12.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 05 日
如果觉得我的文章对你有用,请随意赞赏