一、介绍
正则表达式用来描述或者匹配符合规则的字符串。它的用法和 like 比较相似,但是它又比 like 更强大,能够实现一些很特殊的规则匹配。正则表达式需要使用 regexp 命令,匹配上返回 1 匹配不上返回 0,默认不加条件 regexp 相当于 like "%%",在前面加上 not 相当于 not like。
^ # 在字符的开头处进行匹配
$ # 在字符的末尾处进行匹配
. # 匹配任何字符(包括回车和新行)
[...] # 匹配中括号内的任意单个字符
[m-n] # 匹配m到n之间的任意单个字符,例如[0-9]、[a-z]、[A-Z]
[^..] # 不能匹配括号内的任意单个字符
a? # 匹配0个或1个a
a* # 匹配0个或多个a,包括空,可以作为占位符使用
a+ # 匹配1个或多个a,不包括空
a1|a2 # 匹配a1或a2
a{m} # 匹配m个a
a{m,} # 匹配m个或者更多个a
a{m,n} # 匹配m到n个a
a{,n} # 匹配0到n个a
(...) # 将模式元素组成单一元素,例如:(do)? 匹配0个或1个do
二、使用方式
select "abc" regexp "^a"; -- 1
select "abc" regexp "c$"; -- 1
select "abc" regexp "a."; -- 1
select "abc" regexp ".a"; -- 0
[...]:匹配中括号内的任意单个字符
select "abc" regexp "[xyz]"; -- 0
select "abc" regexp "[xya]"; -- 1
[^...]:注意^符合只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
select "a" regexp "[^abc]"; -- 0
select "x" regexp "[^abc]"; -- 1
select "abc" regexp "[^a]"; -- 1 "abc"作为一个整体,所以它匹配不了a
select "stb" regexp ".ta?b"; -- 1
select "stab" regexp ".ta?b"; -- 1
select "staab" regexp ".ta?b"; -- 0
select "stb" regexp ".ta*b"; -- 1
select "stab" regexp ".ta*b"; -- 1
select "" regexp "a*"; -- 1
select "stb" regexp ".ta+b"; -- 0
select "stab" regexp ".ta+b"; -- 1
select "a" regexp "a|b"; -- 1
select "b" regexp "^(a|b)"; -- 1
select "c" regexp "^(a|b)"; -- 0
select "auuuuc" regexp "au{3}c"; -- 0
select "auuuuc" regexp "au{4}c"; -- 1
select "auuuuc" regexp "au{3,}c"; -- 1
select "auuuuc" regexp "au{4,}c"; -- 1
select "auuuuc" regexp "au{5,}c"; -- 0
select "auuuuc" regexp "au{3,5}c"; -- 1
select "auuuuc" regexp "au{4,5}c"; -- 1
select "auuuuc" regexp "au{5,10}c"; -- 0
(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
三、总结
- 特别要注意最后的()的命令,如果不使用()那么所有的都是指单个字符去做匹配,如果需要使用多个字符作为一个整体去匹配,就需要将多个字符使用()给括起来;
- 使用 regexp 和 not regexp 操作符(类似like和not like);
- regexp 默认是不区分大小写,可以使用 binary 关键词强制区分大小写; where name regexp binary "^[A-Z]";
- regexp 默认是部分匹配原则,即有一个匹配上则返回真。例如:select "Abc" regexp binary "^[A-Z]";