《MySQL必知必会学习笔记》:正则表达式
正则表达式的应用前面的几节的过滤例子允许用匹配、比较和通配操作符来寻找数据。对于基本的数据过滤,这样就足够了。但是随着过滤条件的复杂性的增加,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; 范围只要是连续的就是合法的,例如[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 '^.';//检查字符串是否以点开始。 注意:^有两种用法,如下:
小结上面介绍了的东西比较多,相信一下子也比较难以掌握好,但是,提醒大家的是,不要强迫自己去记住这些细节,当我们多几遍正则表达式 ,这些语法方面的细节就掌握了,即使没有掌握,当我们需要的时候,查下资料就ok了。反正就我而言,无论是学习java还是其他的语言的时候关于正则表达式这一块的细节,我是没有去记的,当需要的时候,我就查下资料然后去写就好。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |