MySQL学习笔记:regexp正则表达式
在MySQL中,模糊搜索的时候主要用两种方式:
1.like
2.regexp + 正则表达式 性能优于like
正则表达式描述了一组字符串。
- 最简单的正则表达式是不含任何特殊字符的正则表达式。例如,正则表达式hello匹配hello。
- 非平凡的正则表达式采用了特殊的特定结构,从而使得它们能够与1个以上的字符串匹配。例如,正则表达式hello|word匹配字符串hello或字符串word。
- 作为一个更为复杂的示例,正则表达式B[an]*s匹配下述字符串中的任何一个:Bananas,Baaaaas,Bs,以及以B开始、以s结束、并在其中包含任意数目a或n字符的任何其他字符串。
例子:
邮箱格式: '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$'
主要使用的操作符如下:
1.(^)字符
匹配字符串的开始位置,如“^a”表示以字母a开头的字符串。
SELECT 'xxxxyy' REGEXP '^xx';
2.($)字符
匹配字符串的结束位置,如“X^”表示以字母X结尾的字符串。
SELECT 'xxxxyy' REGEXP 'Y$'; # 不区分大小写
SELECT 'xxxxyy' REGEXP 'y$';
3.(.)字符
这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。
4.(*)字符
星号匹配0个或多个字符,在它之前必须有内容。
SELECT 'xxxxyy' REGEXP 'x*';
5.(+)字符
匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。
6.(?)字符
问号匹配0次或1次。
其他实例:
# 以"举报"开头
SELECT * FROM rep_require WHERE order_title REGEXP '^举报';
# 以"问题"结尾
SELECT * FROM rep_require WHERE order_title REGEXP '问题$';
# 包含"无照经营"字符串
SELECT * FROM rep_require WHERE order_title REGEXP '无照经营';
# 以a-z开头 或者 ok结尾
SELECT * FROM rep_require WHERE order_title REGEXP '^[a-z]|ok$';
SELECT 'fonfo' REGEXP '^fo$'; # -- 字符串完全等于fo 定义了开头和结尾
SELECT 'fonfo' REGEXP '^fo.+fo$'; # -- fo开头 中间包含至少1个字符 fo结尾
SELECT 'fonfo' REGEXP '^fo.*fo$'; # -- . 不用加[] fo开头 fo结尾 中间随意
SELECT 'fofo' REGEXP '^fo$'; # -- 不行
SELECT 'fofo' REGEXP '^f.*'; # -- f开头 后面随意 0个或者无数个
SELECT 'Ban' REGEXP '^Ba*n'; # -- 以B开头 任意几个a 再n
SELECT 'Baaaaan' REGEXP '^Ba*n'; # -- 同上
SELECT 'Bn' REGEXP '^Ba*n'; # -- 同上
SELECT 'Ban' REGEXP '^Ba+n'; # # -- 至少一个a
SELECT 'Bn' REGEXP '^Ba+n'; # -- 不行 没有a 匹配不到
SELECT 'Ban' REGEXP '^Ba?n'; # -- 0个a 或者 1个a
SELECT 'Bn' REGEXP '^Ba?n'; # -- 同上
SELECT 'Baaaan' REGEXP '^Ba?n'; # -- 同上
# pi 或者 apa 规定了^$ 就必须完全相等才能匹配得到
SELECT 'pi' REGEXP 'pi|apa';
SELECT 'axe' REGEXP 'pi|apa';
SELECT 'apa' REGEXP 'pi|apa';
SELECT 'apa' REGEXP '^(pi|apa)$';
SELECT 'pi' REGEXP '^(pi|apa)$';
SELECT 'pix' REGEXP '^(pi|apa)$';
# 多个pi匹配
SELECT 'pi' REGEXP '^(pi)*$';
SELECT 'pip' REGEXP '^(pi)*$';
SELECT 'pipi' REGEXP '^(pi)*$';
特殊写法:{1} {1,} {2,3}
- a* 可以写成{0,}
- a+ 可以写成a{1,}
- a? 可以写成a{0,1}
在{}内只有一个整型参数i,表示字符只能出现i次;
在{}内有一个整型参数i,后面跟一个“,”,表示字符可以出现i次或i次以上;
在{}内只有一个整型参数i,后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下(包括i次和j次)。
其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是255)。
如果有两个参数,第二个必须大于等于第一个。
# {1} {1,} {2,3} 写法
SELECT 'xxx' REGEXP 'x{4}'; # 4个x
SELECT 'aXbc' REGEXP '[a-dXYZ]'; # 匹配“a”、“b”、“c”、“d”或“X”
SELECT 'aXbc' REGEXP '^[a-dXYZ]$';
SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';
SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$'; # 匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。
SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';
SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';
# “[”、“]”必须成对使用
END 2018-06-01 13:17:19
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)