初识Mysql(part7)--我需要知道的5个关于正则的小知识

学习笔记,以代码和例子堆砌而成,方便查阅。
参考书籍:《Mysql必知必会》等
要点:REGEXP关键字、BINARY关键字、转义、字符类、正则测试

因为正则表达式笔者专门写了一系列Blog,所以这里对正则表达式的用法,不做过多阐述,主要看正则在Mysql中的应用。


此Blog里的例子都会用下面store数据表:

# id, product, price, grade, pro_date, note
'1', 'Snob201', '2300.23', 'B', 1998, 'Snob 2000 expand'
'2', 'Snob301', '1289.21', 'C', 1996, 'Snob 3000 expand'
'3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand'
'4', 'GibeX01', '3232.76', 'A', 2000, 'X serise 1'
'5', 'GibeX02', '1200.00', 'D', 2000, 'X serise 2'
'6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2'
'7', 'GibeU300', '3000.78', 'A', 2010, '2.1 X serise 2'
'8', 'SnobR001', '6321.54', 'B', 2010, 'R (no.1)'
'9', 'SnobR002', '3245.54', 'A', 2011, 'R (no.2)'
'10', 'AdroitX001', '6543.90', 'B', 2014, 'Lose'
'11', 'AdroitX002', '1050.00', 'D', 2015, 'Lose'

注意!Mysql仅支持多数正则表达式实现的一个很小的子集。

  • 关键字LIKE与关键字REGEXP

首先,看下面这行sql语句:

SELECT * from store WHERE product REGEXP '200';

输出:

# id, product, price, grade, pro_date, note
'6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2'

我们看到拿到了product='GibeU200’的记录。

现在我想理顺REGEXP和LIKE的区别。

我们把上面的sql语句中的REGEXP替换成LIKE:

SELECT * from store WHERE product LIKE '200';

输出:

# id, product, price, grade, pro_date, note

啥都没匹配到。

这是因为REGEXP将找出product中包含’200’的记录,而LIKE则要找的是product='200’的记录。如果LIKE想要匹配部分值(与REGEXP语句相同的效果),则需要使用通配符%或通配符_(%200%)。那么怎样使REGEXP匹配全部值(与LIKE有相同的效果)呢,这时就要用元字符^和元字符$(^200$)

  • 匹配大小写

首先,来一段代码:

SELECT * FROM store WHERE product REGEXP 'snob';

输出:

# id, product, price, grade, pro_date, note
'1', 'Snob201', '2300.23', 'B', 1998, 'Snob 2000 expand'
'2', 'Snob301', '1289.21', 'C', 1996, 'Snob 3000 expand'
'3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand'
'8', 'SnobR001', '6321.54', 'B', 2010, 'R (no.1)'
'9', 'SnobR002', '3245.54', 'A', 2011, 'R (no.2)'

可以看到,匹配到了5条记录,但是这里我们用小写的’snob’就匹配到了大写的’Snob’,我不想这样,我想大写匹配大写,小写匹配小写,这里可以使用BINARY关键字来实现:

SELECT * FROM store WHERE product REGEXP BINARY 'snob';

输出:

# id, product, price, grade, pro_date, note

嗯!不错,这样小写的’snob’就啥也匹配不到了。

  • 转义

如果我想匹配.可咋整,我们知道.是正则表达式中的元字符,所以我们需要对其进行转义,方法就是在.之前加\\。来个例子先:

SELECT * FROM store WHERE note REGEXP '2\\.0';

输出:

# id, product, price, grade, pro_date, note
'3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand'
'6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2'

多数正则表达式用\单斜杠就能实现转义的功能,那为啥mysql要用\\双斜杠呢?这里和python用\\双斜杠进行转义的原因差不多,详见:正则表达式的转义

  • 匹配字符类

因为笔者实在懒得打字了,就放图片吧:

来个字符类的例子:

SELECT * FROM store WHERE note REGEXP '[[:digit:]]{4}';

输出:

# id, product, price, grade, pro_date, note
'1', 'Snob201', '2300.23', 'B', 1998, 'Snob 2000 expand'
'2', 'Snob301', '1289.21', 'C', 1996, 'Snob 3000 expand'
'3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand'

再来个字符类例子,加深一下印象呗:

SELECT * FROM store WHERE note REGEXP '^[[:digit:]]\\.[0-9]';

输出:

# id, product, price, grade, pro_date, note
'3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand'
'6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2'
'7', 'GibeU300', '3000.78', 'A', 2010, '2.1 X serise 2'
  • 对正则表达式的简单测试

可以在不使用数据库的情况下,用SELECT来测试正则表达式,REGEXP检查将返回0(没有匹配)或1(匹配),来个例子:

SELECT '应用回归分析第4版' REGEXP '第[1-9]版';

输出:

'1'
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoatGui

谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值