正则表达式的应用
前面的几节的过滤例子允许用匹配、比较和通配操作符来寻找数据。对于基本的数据过滤,这样就足够了。但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加。这也就是正则表达式变得有用的地方。
正则表达式是用来匹配文本中特殊的字符集合。
正则表达式不是自己第一次见,在JAVA/C++ 这些语言中,都有正则表达式,不过他们的用途是一样的,都是匹配文本中的字符串。可能具体的用法不太一样,但也差不多。下面将一一进行学习、介绍。
基本字符的匹配
当我们想查找某列中的字符中是否有某个字符时,虽然可以通过前面的博文中介绍的通配符来完成,但是也是可以通过正则表达式来完成的。如下:
select * from student where name regexp '1' order by id;//找出name中含有 字符1的记录。
从上面的例子中,或许还没有看到正则表达式所带来的好处,感觉这个不就是和通配符一样的么。有这个感觉是很正常的,因为这个例子确实没有体现出正则表达式的强大之处。看完下面的介绍你可能慢慢就会感觉正则表达式的强大之处。
进行OR匹配
为搜索多个字符串时,在正则表达式中使用 | 进行实现。
select * from student where name regexp '123|456';//|为正则表达式的or操作符。它表示匹配其中之一,因此,只要是字符串中含有123或者是456的记录就返回。
实践结果截图如下:
匹配几个字符之一
如果你只想匹配特定的字符,应该怎么办呢?
- 解决的方法就是:通过制定一组用 [ 和 ] 括起来的字符来完成即可。
例如,如果你想匹配所有字符串中含有偶数数字的数据时,你只需要用[]将指定的数据放入就可以了,具体如下:
select * from student where name regex '[02468]' order by score;//通过[02468]就可以匹配了
[]是另一种形式的or操作符的语句。事实上,[02468]等价于 0|2|4|6|8
匹配范围
上面的集合[02468]用来匹配多个字符,而[0123456789] 这个集合就是匹配数字0到9;
为简化这种类型的集合,可以使用-来定义一个范围。
例如:[0123456789] 就可以写成 [0-9];
范围只要是连续的就是合法的,例如[1-3] [7-9] 以及[B-G] 这些集合都是ok的。
匹配特殊字符
正则表达式中由具有特定含义的特殊字符构成,例如 [ ] | . 等等。
当我们想在字符串中匹配这些字符时,应该如何进行匹配呢?
相信学过JAVA 或者是C++ 的都知道,如果想匹配这些特殊的字符, 就应该对其进行转义,转义的方法为:在这些特殊的字符前面加上两个反斜杠,即 \\;例如,\\[ , \\] \\| \\. 等;
下面就以 匹配字符串中的 . 这个特殊符号进行举例说明。
select * from student where name regexp '\\.';//返回的结果就是含有字符 . 的结果
如果我们不用 \\对点 进行转义,则因为 点.是用来匹配任意一个字符的,因此,会出现所有的结果,并不是我们想要的。
具体结果如下:
匹配字符类
匹配字符类,可以这样理解,就是为了方便,系统给我们提供了一些简写。例如 在JAVA中 使用\\d来匹配任意数字,而在MySQL中 使用[:digit:] 来进行任意数字的匹配。
具体见下面表格(图片来源于《MySQL必知必会))
匹配多个实例
目前为止使用的正则表达式都试图匹配单次出现。即如果存在一个匹配,则该行就被检索出来,否则就不被检索出来。
但有时需要对匹配的数目进行更强的控制。例如,当你寻找一个单词时,也想它能够找出这个单词的复数形式(即尾随的s)。
select * from student where name regexp 'rang?';//匹配name中含有ran或者是带有后缀g的数据。
更多的关于匹配多个实例的符号如下:
定位符
前面介绍的都是任意位置的匹配,但是,有的时候,我们想在特定的位置进行匹配,例如:想匹配字符串的开始处是否是以 点 开始的,而不是匹配字符串中任意位置是否含有点。这就需要定位符。
使用例子说明如下:
select * from student where name regexp '^\\.';//检查字符串是否以点开始。
注意:^有两种用法,如下:
- 在集合中(用[ 和 ]定义的),用它来否定该集合,例如[^01234]:指的就是匹配除了012345其它的字符。
- 用来指串的开始处。
小结
上面介绍了的东西比较多,相信一下子也比较难以掌握好,但是,提醒大家的是,不要强迫自己去记住这些细节,当我们多几遍正则表达式 ,这些语法方面的细节就掌握了,即使没有掌握,当我们需要的时候,查下资料就ok了。反正就我而言,无论是学习java还是其他的语言的时候关于正则表达式这一块的细节,我是没有去记的,当需要的时候,我就查下资料然后去写就好。