• MySQL REGEXP正则表达式


    首先说下LIKE命令都涉及到的通配符:

    • % 替代一个或多个字符
    • _ 仅替代一个字符
    • [charlist] 字符列中的任何单一字符
    • [^charlist]或者[!charlist] 不在字符列中的任何单一字符

    其中搭配以上通配符可以让LIKE命令实现多种技巧:

    1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。

    2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。

    3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。

    4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。

    5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。

    6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。

    7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

    不过,MySQL 、SQLite 只支持 % 和 _ 通配符,不支持 [^charlist] 或 [!charlist] 通配符( MS Access 支持,微软 office 对通配符一直支持良好,但微软有时候的通配符不支持 %,而是 *,具体看对应软件说明)。通配符和正则不是一回事。

    MySQL 和 SQLite 会把 like '[xxx]yyy' 的中括号当成普通字符,而不是通配符。

    比如:

    select * from persons WHERE City LIKE '[b]eijing'

    将查出 city 为 [b]eijing 的行,而不是 city 为 beijing 的行。

    MySQL 中要完成 [^charlist] 或 [!charlist] 通配符的查询效果,需要通过正则表达式来完成。

    select * from persons WHERE City REGEXP '[b]eijing' SQLite不支持Regexp正则方法。

    (^)字符

    匹配字符串的开始位置,如“^a”表示以字母a开头的字符串。

    mysql> SELECT name FROM person_tbl WHERE name REGEXP "^st";

    ($)字符

    匹配字符串的结束位置,如“X$”表示以字母X结尾的字符串。

    mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

    (.)字符

    这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。

    (*)字符

    星号匹配0个或多个字符,在它之前必须有内容。如:

    mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) 
    mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) 
    mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)

    (+)字符

    加号匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。

    mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) 
    mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)

    (?)字符

    问号匹配0次或1次。

    mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) 
    mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) 
    mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)

    a*

    可以写成a{0,}

    a+

    可以写成a{1,}

    a?

    可以写成a{0,1}

      在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下(包括i次和j次)。其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是255)。 如果有两个参数,第二个必须大于等于第一个。

    (abc)*

    匹配任意多个abc(包括空串)

    mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) 
    mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配) 
    mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)

    查询找到所有的名字包函'mar'的字符串

    mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
     查询找到所有名称以元音开始和‘ok’结束
    mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

    [a-dX]

    匹配“a”、“b”、“c”、“d”或“X”

    [^a-dX]

    匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。

    mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配) 
    mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配) 
    mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配) 
    mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配) 
    mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配) 
    mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)

    正则匹配邮箱

    ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+[.][a-zA-Z0-9_-]+$

    要匹配.需要加转义字符,并且必须放在[ ]里

    正则匹配身份证号

     ([1-9]d{5}[12]d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])d{3}[0-9xX])$

     匹配移动电话

     中国移动 134.135.136.137.138.139.150.151.152.157.158.159.187.188 ,147

    ^1(3[4-9]|5[012789]|8[78])d{8}$
  • 相关阅读:
    【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档(转
    PHP Client for Mysql Binlog
    MySQL的binlog日志恢复(转)
    Linux 普通进程 后台进程 守护进程(转)
    实战:MySQL Sending data导致查询很慢的问题详细分析(转)
    mysql索引无效且sending data耗时巨大原因分析
    阿里云-DRDS(转)
    MySQL查看SQL语句执行效率(转)
    nginx php-fpm 输出php错误日志(转)
    Golang指针基本介绍及使用案例
  • 原文地址:https://www.cnblogs.com/qiuyuyu/p/11326894.html
Copyright © 2020-2023  润新知