正则表达式REGEXP可以理解为可支持更多规则/通配符的LIKE,可以对检索内容进行更强的控制。LIKE本身只能和%及_这两种通配符连接进行粗略的搜索,而REGEXP可以支持更多规则,比如.是和%一样的可匹配任意一个字符的正则模式,[]可匹配一个范围,如REGEXP '[1-5] ton'可以搜索出来1 ton、2 ton、3 ton、4 ton、5 ton。
一些正则模式:
. :匹配任意一个字符,类似于%
| :类似于OR
[] :字符集合,可用|隔开表or选项,也可用-定义范围
[^] :类似于NOT,匹配非[]框内的
定位元字符 :
^ :匹配输入字符串的开始位置【^有两种用法,一种是开始位置,一种和[]连在一起表示NOT】
$ :匹配输入字符串的结束位置
[[:<:]] :词的开始
[[:<:]] :词的结尾
字符类 (预定义的字符集,类似“快捷键”):
重复元字符 :
* :0次或多次匹配
+ :1次或多次匹配(等于{1,})
? :匹配它前面的任何字符0次或1次(等于{0,1})
{n} :指定数目的匹配
{n,} :不少于指定数目的匹配
{n,m} :匹配数目的范围(m不超过255)
正则表达式略复杂,但用好了会非常方便,所以务必把各种正则模式记熟。
关于特殊字符所在位置会造成不同影响,有个小例子:
^[0-9\\.]表示查找以0-9里任意一个数字和“.”开头的字符串
[^0-9\\.]表示除了“0-9.”这个单词外的任意字符串
转义
如果想搜出代表正则模式字符本身,比如想查找“.”,如果直接输REGEXP '.',那么查找出来的将是全部行,因为“.”表示任意字符;又比如想查找“|”,直接输REGEXP '|',那么查找不出结果,因为正则表达式认为这是or的含义,此时需要用到“转义”的功能,即在想查找的特殊字符前输入两条斜杠——“//”,告诉正则表达式现在要查找的是特殊字符本身,而不是它所代表的含义。
另外还有一些在SQL练习中碰到的其他注意事项:
NOT只对单个字段有效,如果想多重否定,需要在每个字段前都加上NOT,比如 WHERE vend_id NOT IN(1002,1003) AND prod_price NOT IN (5.99)
通配符%可以任意长度的字符,包括0字符,但不能匹配出NULL;_只能匹配单个字符。注意尽量少使用通配符,并且尽量不要在开头使用,避免搜索时间过长。
查询语句:
结果:
查询语句:
结果:
查询语句:
结果:
查询语句:
正则表达式 [32]1,[32]定义一组字符,它的意思是匹配 3 或匹配 2,也就是「31」或者 「21」都算是匹配的。
结果:
查询语句:
结果:
如果要匹配特殊字符的,需要加上前导「\」,「\-」表示查找「-」,「\.」表示查找「.」
这种就是 「转义(escaping)」 ,在正则表达式里,本身有意义的字符,比如「.」是匹配任意字符的意思。那如果要匹配它,需要转义。
注意:在 MySQL 里,是比其他的正则表达式多一个「\」的,就是「\」。
趣味提问:
如何匹配「\」?
答案:「\\」
\\([0-9] sticks?\\) 匹配的是(NUM stick)或者(NUM sticks)。s后的 ? 使得s可选。
重复元字符
* 是 0 个或多个匹配
? 是 1 个或多个匹配
{n} 是指定n个匹配
{n,} 是 不少于 n 个匹配
{n,m} 是 指定匹配的范围,m不超过 255
查询语句:
^值的是字符串的开始,$是字符串的结尾。
这就是 REGEXP 与 LIKE 类似,但是它独特的好处:可以通过「定位符」只匹配「子字符串」。
结果:
SQL正则表达式可以用来搜索和匹配连续增加数字的字符串。如果要搜索从1开始的连续增加的数字,可以使用以下表达式:"\d+",这可以匹配一位或多位数字,例如:1,2,3,4,5等。如果要搜索从某个特定数字开始的连续增加的数字,可以使用以下表达式:"[start_num-9]+",其中start_num可以替换为任何数字。例如,如果要搜索从10开始的连续增加的数字,可以使用"[10-9]+",这会匹配10,11,12,13,14,15等。
如果要搜索从某个特定数字开始,并且增加的步长不一样的连续增加的数字,可以使用以下表达式:"[start_num-step_size]+",其中start_num是起始数字,step_size是增加的步长,例如,如果要搜索从10开始,并且每次增加2的连续增加的数字,可以使用"[10-2]+",这会匹配10,12,14,16,18等。
总的来说,使用正则表达式可以搜索和匹配各种连续增加的数字,只要根据自身的需求调整表达式即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)