Qianfeng

DON'T WORRY BE HAPPY
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql笔记9:用正则表达式进行搜索

Posted on 2022-02-04 15:39  RonnieOS  阅读(69)  评论(0编辑  收藏  举报

注意: mysql支持的正则表达式只是多数正则表达式的一个小子集

9.2.1 基本字符匹配

  • 使用regexp关键字:
    select * from products where prod_name regexp '1000' order by
    prod_name;
    会返回所有prod_name严格等于1000的行

  • '.'用来匹配任意一个字符,如:
    select * from products where prod_name regexp '.000' order by prod_name;
    会匹配所有prod_name 为000结尾,开始还有一个字符的行。

  • LIKE后的东西如果是在列值内出现,不会返回,因为like匹配整列。但是regexp后的东西如果在列内出现,则会进行匹配。如何用正则表达式匹配整个列呢?使用'^'或者'$'即可。

  • mysql的regexp是不区分大小写的(like区分大小写), 因此如果希望正则表达式区分大小写,应该使用regexp binary关键字。

  • '|'是正则表达式中的or条件。即'123|324|56'会匹配123或者324或者56.

  • '.'用来匹配任意字符,但是有时候我们可能只希望在某个位置匹配特定的字符,这个时候应当使用[],例如:

    这个时候,只会匹配1000和2000,而3000就不会被匹配。
    注意:[12]等价于[1|2],你也可以写成后者。

  • 有时候我们需要用[|]的形式,是因为我们需要确定or的范围,即[]在正则表达式里又充当括号的功能:

会检索出1或者2或者3 ton。但实际上我们期望的结果应当这样写:
```select * from products where prod_name regexp '[1|2|3] ton';

这样只会匹配1 ton或者2 ton 或者3 ton.

  • 字符集合可以被否定,在集合的开始处使用。[123]会匹配1或者2或者3,但是[123]会匹配除了123之外的字符

  • 匹配范围:有时候我们可以简化[]内的数字:
    [0-9]表示匹配范围为0,1,2,3,4,5,6,7,8,9。[b-z]表示b到z之间的任一字母

  • 如何匹配特殊字符?用转义:"\-", "\.", "\[", 反斜杠本身是"\".

  • 可以使用预定义的字符类,诸如[:alnum:],[:alpha:],[:blank:],[:digit:],[:lower:]等

  • 重复元字符包括*,+,?,{n},{n,},{n,m}。使用如下:
    SELECT prod_name FROM products WHERE prod_name RGEEXP '\([0-9] sticks?\)';
    问号匹配前面的那个字符一次或者零次,本例中stick和sticks都是合法的。

  • 重复的4个数字可以用 regexp '[:digit:]{4}',其中[:digit:]为字符类。

9.1.2 定位符

mysql的正则表达式默认匹配串中任意位置的文本,为了匹配特定位置的文本,需要使用定位符。

  • 例如我们想找出小数,我们不能用'[:digit:]\.',因为会匹配中间的。解决办法就是使用定位符^, ^匹配串的开始。
    SELECT prod_name FROM products WHERE prod_name REGEXP '[1]\.';

  • 如何让REGEXP来匹配整个列,就像LIKE一样?同时使用开始和结束定位符,即^和$即可。如:
    select prod_name from products where prod_name regexp '[2]\.$';

  • 我们甚至可以不使用数据表,而用正则表达式匹配字符串,结果为boolean型。


  1. 0-9 ↩︎

  2. 0-9 ↩︎