zoukankan      html  css  js  c++  java
  • MySQL中REGEXP正则表达式使用大全

    REGEXP在mysql是用来执行正则表达式的一个函数

    像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。

    MySql用户手册建议,在构造简单查询时,仍使用通配符。

    如:Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];

    但在一些特殊查询中,不用正则表达式是不行的。MYSQL提供的正则表达式WHERE谓词有三个,分别是:
    REGEXP, RLIKE, NOT RLIKE
    用这三个替换原有的LIKE谓词,后面即可以跟正则表达式

    例如要查询字段中含有“_”的数据,则要用以下查询语句:

    SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

    扩展正则表达式的一些字符是:

    · ‘.’匹配任何单个的字符。

    · 字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

    · “ * ”匹配零个或多个在它前面的字符。

    例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。

    如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。 
    为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。 
    为了找出以“b”开头的名字,使用“^”匹配名字的开始:

    使用正则

    SELECT * FROM pet WHERE name REGEXP BINARY ‘^b’;
    SELECT * FROM pet WHERE name REGEXP ‘fy$’;
    SELECT * FROM pet WHERE name REGEXP ‘w’;
    SELECT * FROM pet WHERE name REGEXP ‘^…..$’;
    SELECT * FROM pet WHERE name REGEXP ‘^.{5}$’;


    今天在应用中遇到了这样的一个问题, 
    有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2

    需要从里面搜索出比如说:第一个逗号前的数字范围为3-5之间,第三个逗号前的数字的范围为3-5之间,第10个逗号前的数字范围为3-5之间,其余的都为1-5之间。。。

    则sql语句可以这么写:

        SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';

    1. 使用LIKE和NOT LIKE比较操作符(注意不能使用=或!=);

    2. 模式默认是忽略大小写的;

    3. 允许使用”_”匹配任何单个字符,”%”匹配任意数目字符(包括零字符);

    项目中实战:



    附一些mysql正则规则

    ^                         匹配字符串的开始部分

    $                         匹配字符串的结束部分

    .                          匹配任何字符(包括回车和新行)

    a*                       匹配0或多个a字符的任何序列

    a+                       匹配1个或多个a字符的任何序列

    a?                       匹配0个或1个a字符

    de|abc               匹配序列de或abc

    (abc)*                匹配序列adc的0个或者多个实例

     

    {n}、{m,n}        {n}或{m,n}符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或“部分”)。m和n均为整数。

    a*              可被写为a{0,}

    a+              可被写为a{1,}

    a?              可被写为a{0,1}

     

    [a-dX]                 匹配任何是a,b,c,d或者X的字符,两个其他字符之间的’-'字符构成一个范围

    [^a-dX]               匹配任何不是a,b,c,d或者X的字符,前面的字符’^'是否定的意思

     

    [.characters.]  在括号表达式中(使用[和]),匹配用于校对元素的字符序列,字符为单个字符或新行等字符名

    mysql> SELECT ‘~’ REGEXP ‘[[.~.]]’;                                                        -> 1

    mysql> SELECT ‘~’ REGEXP ‘[[.tilde.]]’;                                                 -> 1

     

    [=character_class=]

    在括号表达式中(使用[和]),[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配,包括它本身,

    [[=a=]]              等同于[a(+)],[a+],[a{1,}]

     

    [:character_class:]

    在括号表达式中(使用[和]),[:character_class:]表示与术语类的所有字符匹配的字符类。

    标准的类名称是:

    alnum       文字数字字符

    alpha        文字字符

    blank         空白字符

    cntrl          控制字符

    digit          数字字符

    graph        图形字符

    lower        小写文字字符

    print          图形或空格字符

    punct        标点字符

    space        空格、制表符、新行、和回车

    upper        大写文字字符

    xdigit        十六进制数字字符

     

    [[:<:]], [[:>:]]

    这些标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符,其前面和后面均没有字字符。字符是alnum类中的字母数字字符或下划线(_)。

    mysql> select ‘fang shan zi’ regexp ‘[[:<:]]shan[[:>:]]’;             -> 1

    mysql> select ‘fang shan zi’ regexp ‘[[:<:]]fang[[:>:]]’;              -> 1

    mysql> select ‘fang shans zi’ regexp ‘[[:<:]]shan[[:>:]]’;           -> 0

     

    正则表达式使用特殊字符,应在其前面加上2个反斜杠’'字符

    mysql> SELECT ’1+2′ REGEXP ’1+2′;                       -> 0

    mysql> SELECT ’1+2′ REGEXP ’1+2′;                      -> 0

    mysql> SELECT ’1+2′ REGEXP ’1+2′;                     -> 1

     
    使用MySQL正则表达式 __MySQL必知必会

    正则表达式作用是匹配方本,将一个模式(正则表达式)与一个文本串进行比较。

    MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定用正则表达式过滤SELECT检索出的数据。

    MySQL仅支持多数正则表达式实现的一个很小的子集。

    ----------------------

    9.2.1  基本字符匹配

    REGEXP后所跟的东西作为正则表达式处理。 

    复制代码
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '1000'
    ORDER BY prod_name;

    ------返回------
    +------------------------+
    | prod_name |
    +------------------------+
    | JetPack 1000 |
    +------------------------+
    复制代码

    .  表示匹配任意一个字符。

    MySQL中的正则表达式匹配不区分大小写。

    为区分大小写,可使用BINARY关键字。

    如:WHERE prod_name REGEXP BINARY 'JetPack .000'

    9.2.2  进行OR匹配

    为搜索两个串之一(或者这个串,或者为另一个串),使用 | 。

    | 作为OR操作符,表示匹配其中之一。可给出两个以上的OR条件。

    代码

    [ ] 匹配任何单一字符。

    [123]定义一组字符,意思是匹配1或2或3.

    [ ]是另外一种形式的OR语句,[123] Ton  就是  [1 | 2 | 3] Ton 的缩写。

    ^ 否定一个字符集合,将匹配除指定字符外的任何东西。[^123]将匹配除这些字符外的任何东西。

    代码

    匹配范围

    [0123456789] 或 [0-9] 将匹配数字0到9

    [a-z] 匹配任意字母符号

    代码

    匹配特殊字符

    \  为前导。即转义.正则表达式内具有特殊意义的所有字符都必须以这种方式转义。

    \-  表示查找 -

    \.  表示查找 .

    代码

    \  也用来引用元字符(具有特殊意义的字符)

    \f    换页
    \n 换行
    \r 回车
    \t 制表
    \v 纵向制表

    匹配字符类

    代码

    匹配多个实例

    代码

    以下例子:s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现。

    代码

    匹配连在一直的4位数字:WHERE prod_name REGEXP '[[:digit:]]{4}'

    定位符

    ^         文本的开始
    $ 文本的末尾
    [[:<:]] 词的开始
    [[:>:]] 词的结尾
    代码

    ^的双重用途:在集合中(用[ ]定义),用它来否定该集合。否则,用来指串的开始和。

    LIKE 匹配整个串,而REGEXP匹配子串。

        简单的正则表达式测试  可以在不使用数据库的情况下用SELECT来测试正则表达式。

        REGEXP检查总是返回0(没有匹配)或1(匹配),可以用带文字串的REGEXP来测

        试表达式,并试验它们。相应的语法如下:

            SELECT 'hello' REGEXP '[0-9]'

        这个例子返回0(因为文本hello中没有数字)。

    MySQL中REGEXP正则表达式使用大全

    以前我要查找数据都是使用like后来发现mysql中也有正则表达式了并且感觉性能要好于like,下面我来给大家分享一下mysql REGEXP正则表达式使用详解,希望此方法对大家有帮助。

    MySQL采用Henry Spencer的正则表达式实施,其目标是符合POSIX 1003.2。请参见附录C:感谢。MySQL采用了扩展的版本,以支持在SQL语句中与REGEXP操作符一起使用的模式匹配操作。请参见3.3.4.7节,“模式匹配”。

    在本附录中,归纳了在MySQL中可用于REGEXP操作的特殊字符和结构,并给出了一些示例。本附录未包含可在Henry Spencer的regex(7)手册页面中发现的所有细节。该手册页面包含在MySQL源码分发版中,位于regex目录下的regex.7文件中。

    正则表达式描述了一组字符串。最简单的正则表达式是不含任何特殊字符的正则表达式。例如,正则表达式hello匹配hello。

    非平凡的正则表达式采用了特殊的特定结构,从而使得它们能够与1个以上的字符串匹配。例如,正则表达式hello|word匹配字符串hello或字符串word。

    作为一个更为复杂的示例,正则表达式B[an]*s匹配下述字符串中的任何一个:Bananas,Baaaaas,Bs,以及以B开始、以s结束、并在其中包含任意数目a或n字符的任何其他字符串。

    以下是可用于随REGEXP操作符的表的模式。

    短信验证码接口
    短信验证码接口
    千峰培训
    千峰培训
    免费获得q币
    免费获得q币
    网络编程
    网络编程
    挂机赚钱
    挂机赚钱

    应用示例,查找用户表中Email格式错误的用户记录:

    1
    2
    3
    SELECT *
    FROM users
    WHERE email NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$'

    MySQL数据库中正则表达式的语法,主要包括各种符号的含义。

    (^)字符

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

    1
    2
    3
    4
    5
    6
    7
    8
    mysql> select 'xxxyyy' regexp '^xx';
     
    +-----------------------+
    | 'xxxyyy' regexp '^xx' |
    +-----------------------+
    |           1 |
    +-----------------------+
    1 row in set (0.00 sec)

    查询xxxyyy字符串中是否以xx开头,结果值为1,表示值为true,满足条件。

    ($)字符

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

    (.)字符

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

    (*)字符

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

    1
    mysql> select 'xxxyyy' regexp 'x*';

    这个SQL语句,正则匹配为true。

    (+)字符

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

    (?)字符

    问号匹配0次或1次。

    实例:

    现在根据上面的表,可以装置各种不同类型的SQL查询以满足要求。在这里列出一些理解。考虑我们有一个表为person_tbl和有一个字段名为名称:

    查询找到所有的名字以'st'开头

    1
    mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

    查询找到所有的名字以'ok'结尾

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

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

    1
    mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

    查询找到所有名称以元音开始和'ok'结束 的

    1
    mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

    一个正则表达式中的可以使用以下保留字 

    ^

    所匹配的字符串以后面的字符串开头

    1
    2
    mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配)
    mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配)

    $

    所匹配的字符串以前面的字符串结尾

    1
    2
    3
    mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配)
    mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配)
    .

    匹配任何字符(包括新行)

    1
    2
    mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配)
    mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配)

    a*

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

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

    a+

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

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

    a?

    匹配一个或零个a

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

    de|abc

    匹配de或abc

    1
    2
    3
    4
    5
    6
    mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配)
    mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配)
    mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配)
    mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配)
    mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配)
    mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)

    (abc)*

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

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

    {1} 
    {2,3}

    这是一个更全面的方法,它可以实现前面好几种保留字的功能

    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)。 如果有两个参数,第二个必须大于等于第一个

    [a-dX]

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

    [^a-dX]

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

    “[”、“]”必须成对使用

     

    1
    2
    3
    4
    5
    6
    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(表示不匹配)

    REGEXP在mysql是用来执行正则表达式的一个函数

    标签: REGEXPsql正则表达式模式匹配
     2153人阅读 评论(0) 收藏 举报
     分类:
                                                                REGEXP在mysql是用来执行正则表达式的一个函数
    像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。
     

    MySql用户手册建议,在构造简单查询时,仍使用通配符。


    如:Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];

    但在一些特殊查询中,不用正则表达式是不行的。MYSQL提供的正则表达式WHERE谓词有三个,分别是:
    REGEXP, RLIKE, NOT RLIKE
    用这三个替换原有的LIKE谓词,后面即可以跟正则表达式

    例如要查询字段中含有“_”的数据,则要用以下查询语句:

    SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

    扩展正则表达式的一些字符是:

    · ‘.’匹配任何单个的字符。

    · 字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

    · “ * ”匹配零个或多个在它前面的字符。

    例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。

    如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。 
    为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。 
    为了找出以“b”开头的名字,使用“^”匹配名字的开始:

    使用正则

    SELECT * FROM pet WHERE name REGEXP BINARY ‘^b’;
    SELECT * FROM pet WHERE name REGEXP ‘fy$’;
    SELECT * FROM pet WHERE name REGEXP ‘w’;
    SELECT * FROM pet WHERE name REGEXP ‘^…..$’;
    SELECT * FROM pet WHERE name REGEXP ‘^.{5}$’;


    今天在应用中遇到了这样的一个问题, 
    有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2

    需要从里面搜索出比如说:第一个逗号前的数字范围为3-5之间,第三个逗号前的数字的范围为3-5之间,第10个逗号前的数字范围为3-5之间,其余的都为1-5之间。。。

    则sql语句可以这么写:

        SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';

    1. 使用LIKE和NOT LIKE比较操作符(注意不能使用=或!=);

    2. 模式默认是忽略大小写的;

    3. 允许使用”_”匹配任何单个字符,”%”匹配任意数目字符(包括零字符);

    项目中实战:



    附一些mysql正则规则

    ^                         匹配字符串的开始部分

    $                         匹配字符串的结束部分

    .                          匹配任何字符(包括回车和新行)

    a*                       匹配0或多个a字符的任何序列

    a+                       匹配1个或多个a字符的任何序列

    a?                       匹配0个或1个a字符

    de|abc               匹配序列de或abc

    (abc)*                匹配序列adc的0个或者多个实例

     

    {n}、{m,n}        {n}或{m,n}符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或“部分”)。m和n均为整数。

    a*              可被写为a{0,}

    a+              可被写为a{1,}

    a?              可被写为a{0,1}

     

    [a-dX]                 匹配任何是a,b,c,d或者X的字符,两个其他字符之间的’-'字符构成一个范围

    [^a-dX]               匹配任何不是a,b,c,d或者X的字符,前面的字符’^'是否定的意思

     

    [.characters.]  在括号表达式中(使用[和]),匹配用于校对元素的字符序列,字符为单个字符或新行等字符名

    mysql> SELECT ‘~’ REGEXP ‘[[.~.]]’;                                                        -> 1

    mysql> SELECT ‘~’ REGEXP ‘[[.tilde.]]’;                                                 -> 1

     

    [=character_class=]

    在括号表达式中(使用[和]),[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配,包括它本身,

    [[=a=]]              等同于[a(+)],[a+],[a{1,}]

     

    [:character_class:]

    在括号表达式中(使用[和]),[:character_class:]表示与术语类的所有字符匹配的字符类。

    标准的类名称是:

    alnum       文字数字字符

    alpha        文字字符

    blank         空白字符

    cntrl          控制字符

    digit          数字字符

    graph        图形字符

    lower        小写文字字符

    print          图形或空格字符

    punct        标点字符

    space        空格、制表符、新行、和回车

    upper        大写文字字符

    xdigit        十六进制数字字符

     

    [[:<:]], [[:>:]]

    这些标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符,其前面和后面均没有字字符。字符是alnum类中的字母数字字符或下划线(_)。

    mysql> select ‘fang shan zi’ regexp ‘[[:<:]]shan[[:>:]]’;             -> 1

    mysql> select ‘fang shan zi’ regexp ‘[[:<:]]fang[[:>:]]’;              -> 1

    mysql> select ‘fang shans zi’ regexp ‘[[:<:]]shan[[:>:]]’;           -> 0

     

    正则表达式使用特殊字符,应在其前面加上2个反斜杠’'字符

    mysql> SELECT ’1+2′ REGEXP ’1+2′;                       -> 0

    mysql> SELECT ’1+2′ REGEXP ’1+2′;                      -> 0

    mysql> SELECT ’1+2′ REGEXP ’1+2′;                     -> 1

     

     

    mySQL 里的查询不包含数字

    select *

    from tb
    where col regexp '[^0-9]';

     

     

  • 相关阅读:
    servlet遇到的问题
    servlel出现404问题★ 出现不自动映射 设置XML的问题时候
    c3p0的错误mchange.v2.ser.Indirector
    【转】JSON和JSONP
    性能测试理论
    如何解决包冲突问题
    一方包、二方包、三方包是什么?
    利用selenium webdriver点击alert提示框
    采用Spring管理Bean和依赖注入
    Java加载jar文件并调用jar文件当中有参数和返回值的方法
  • 原文地址:https://www.cnblogs.com/timssd/p/5882742.html
Copyright © 2011-2022 走看看