MySQL正则表达式语法教程

文章作者:中山市飞娥软件工作室「Feiesoft.com」  浏览次数:3938 次  更新日期:2013-10-15

MySQL正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。本教程通过一个著名的解放战争孟良崮战役的双方主要指挥将领的信息为例讲述MySQL正则表达式工具的使用语法,内容较简单,还望网友们不吝赐教。

^ 匹配字符串的开始部分

SELECT 'fefe' REGEXP '^fe'; -> 1

SELECT ' fefe' REGEXP '^fe'; -> 0

$ 匹配字符串的结束部分

SELECT 'fono' REGEXP '^fono$'; -> 1

SELECT 'fono' REGEXP '^fo$'; -> 0

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

SELECT 'fofo' REGEXP '^f.*$'; -> 1

SELECT 'fornfo' REGEXP '^f.*$'; -> 1

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

SELECT 'Ban' REGEXP '^Ba*n'; -> 1

SELECT 'Baaan' REGEXP '^Ba*n'; -> 1

SELECT 'Bn' REGEXP '^Ba*n'; -> 1

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

SELECT 'Ban' REGEXP '^Ba+n'; -> 1

SELECT 'Bn' REGEXP '^Ba+n'; -> 0

a? 匹配0个或1a字符

SELECT 'Bn' REGEXP '^Ba?n'; -> 1

SELECT 'Ban' REGEXP '^Ba?n'; -> 1

SELECT 'Baan' REGEXP '^Ba?n'; -> 0

de|abc 匹配序列deabc

SELECT 'pi' REGEXP 'pi|apa'; -> 1

SELECT 'axe' REGEXP 'pi|apa'; -> 0

SELECT 'apa' REGEXP 'pi|apa'; -> 1

SELECT 'apa' REGEXP '^(pi|apa)$'; -> 1

SELECT 'pi' REGEXP '^(pi|apa)$'; -> 1

SELECT 'pix' REGEXP '^(pi|apa)$'; -> 0

(abc)* 匹配序列abc0个或多个实例

SELECT 'pi' REGEXP '^(pi)*$'; -> 1

SELECT 'pip' REGEXP '^(pi)*$'; -> 0

SELECT 'pipi' REGEXP '^(pi)*$'; -> 1

{n}{m,n}规定紧接上面的规则重复的次数,其中,mn均为整数。

mn必须位于0RE_DUP_MAX(默认为255)的范围内,包含0RE_DUP_MAX。如果同时给定了mnm必须小于或等于n

a* 相当于a{0,},匹配任意多个a

a+ 相当于a{1,} ,匹配至少一个a

a? 相当于a{0,1},匹配任意一个a,包含0a1a

SELECT 'abcde' REGEXP 'a[bcd]{2}e'; -> 0

SELECT 'abcde' REGEXP 'a[bcd]{3}e'; -> 1

SELECT 'abcde' REGEXP 'a[bcd]{1,10}e'; ->1

-两个其他字符之间的“-”字符构成一个范围

从第1个字符开始到第2个字符之间的所有字符匹配。

[0-9]匹配任何1个十进制数字;

[a-z] 匹配任何1个小写英文;

[A-Z] 匹配任何1个大写英文;

[a-dX] 匹配任何是abcdX的字符;

[^a-dX] 匹配任何不是abcdX的字符;

[]]要想包含文字字符“]”,它必须紧跟在开括号“[”之后;

[-0-9]要想包含文字字符“-”,它必须首先或最后写入;

对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。

SELECT 'aXbc' REGEXP '[a-dXYZ]'; -> 1

SELECT 'aXbc' REGEXP '^[a-dXYZ]$'; -> 0

SELECT 'aXbc' REGEXP '^[a-dXYZ]+$'; -> 1

SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$'; ->0

SELECT 'gheis' REGEXP '^[^a-dXYZ]+$'; ->1

SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$'; ->0

[.characters.] 在括号表达式中(使用[]),匹配用于校对元素的字符序列。字符为单个字符或诸如新行等字符名。在文件regexp/cname.h中,可找到字符名称的完整列表。

SELECT '~' REGEXP '[[.~.]]'; -> 1

SELECT '~' REGEXP '[[.tilde.]]'; -> 1

[=character_class=] 在括号表达式中(使用[]),[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配,包括它本身,例如,如果o(+)均是等同类的成员,那么[[=o=]][[=(+)=]][o(+)]是同义词。等同类不得用作范围的端点。

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

它们代表在ctype(3)手册页面中定义的字符类。特定地区可能会提供其他类名。字符类不得用作范围的端点。

SELECT 'justalnums' REGEXP '[[:alnum:]]+'; ->1

SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0

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

SELECT 'a word a' REGEXP'[[:<:]]word[[:>:]]'; -> 1

SELECT 'a xword a' REGEXP'[[:<:]]word[[:>:]]'; -> 0

要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“”字符。MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:

SELECT '1+2' REGEXP '1+2'; -> 0

SELECT '1+2' REGEXP '1+2'; -> 0

SELECT '1+2' REGEXP '1+2'; -> 1

为了验证上面的内容,小编整理了一个实例,还望网友们不吝赐教:

01步:建立1MySQL数据库,取名为:feiesoft_database_2013_10_15

CREATE DATABASE `feiesoft_database_2013_10_15`;

02步:创建1个会员信息表,取名为:user,表中有4个字段,含义见名称:

CREATE TABLE `user` (

`user_id` INT(11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_name` VARCHAR( 32 ) NOT NULL ,
`user_type` VARCHAR( 32 ) NOT NULL ,
`user_addr` VARCHAR( 32 ) NOT NULL

) ENGINE = MYISAM ;

03步:增加6个会员信息:

INSERT INTO `user` VALUES (NULL, '陈毅','解放军', '中国四川省乐至');

INSERT INTO `user` VALUES (NULL, '粟裕','解放军', '中国湖南省会同');

INSERT INTO `user` VALUES (NULL, '顾祝同', '国军', '中国江苏省安东');

INSERT INTO `user` VALUES (NULL, '黄百韬','国军', '中国广东省梅县');

INSERT INTO `user` VALUES (NULL, '张灵甫','国军', '中国陕西省长安县');

INSERT INTO `user` VALUES (NULL, '李天霞','国军', '中国江苏省宝山县');

04+步:开始测试吧!

先看看孟良崮战役俱乐部的会员信息:

mysql> SELECT * FROM `user`;

+---------+-----------+-----------+------------------+

| user_id | user_name| user_type | user_addr        |

+---------+-----------+-----------+------------------+

|       1 | 陈毅      | 解放军    | 中国四川省乐至   |

|       2 | 粟裕      | 解放军    | 中国湖南省会同   |

|       3 | 顾祝同    | 国军      | 中国江苏省安东   |

|       4 | 黄百韬    | 国军      | 中国广东省梅县   |

|       5 | 张灵甫    | 国军      | 中国陕西省长安县 |

|       6 | 李天霞    | 国军      | 中国江苏省宝山县 |

+---------+-----------+-----------+------------------+

查询解放军会员:

mysql> SELECT * FROM `user` WHERE `user_type` REGEXP '解放军';

+---------+-----------+-----------+----------------+

| user_id |user_name | user_type | user_addr      |

+---------+-----------+-----------+----------------+

|       1 | 陈毅      | 解放军    | 中国四川省乐至 |

|       2 | 粟裕      | 解放军    | 中国湖南省会同 |

+---------+-----------+-----------+----------------+

查询四川与湖南的会员:

mysql> SELECT * FROM `user` WHERE `user_addr` REGEXP '四川|湖南'

+---------+-----------+-----------+----------------+

| user_id |user_name | user_type | user_addr      |

+---------+-----------+-----------+----------------+

|       1 | 陈毅      | 解放军    | 中国四川省乐至 |

|       2 | 粟裕      | 解放军    | 中国湖南省会同 |

+---------+-----------+-----------+----------------+

查询ID为1、3、5的会员:

mysql> SELECT * FROM `user` WHERE `user_id` REGEXP '[135]';

+---------+-----------+-----------+------------------+

| user_id | user_name| user_type | user_addr        |

+---------+-----------+-----------+------------------+

|       1 | 陈毅      | 解放军    | 中国四川省乐至   |

|       3 | 顾祝同    | 国军      | 中国江苏省安东   |

|       5 | 张灵甫    | 国军      | 中国陕西省长安县 |

+---------+-----------+-----------+------------------+

查询地址以“县”字结尾的会员:

mysql> SELECT * FROM `user` WHERE `user_addr` REGEXP '县$';

+---------+-----------+-----------+------------------+

| user_id |user_name | user_type | user_addr       |

+---------+-----------+-----------+------------------+

|       4 | 黄百韬    | 国军      | 中国广东省梅县   |

|       5 | 张灵甫    | 国军      | 中国陕西省长安县 |

|       6 | 李天霞    | 国军      | 中国江苏省宝山县 |

+---------+-----------+-----------+------------------+

将“李天霞”的地址改为“中国江苏省宝山县城”

mysql> UPDATE `user` SET `user_addr` = '中国江苏省宝山县城' WHERE `user_id` = 6 LIMIT 1 ;

再次查询地址以“县”字结尾的会员:

mysql> SELECT * FROM `user` WHERE `user_addr` REGEXP '县$';

+---------+-----------+-----------+------------------+

| user_id |user_name | user_type | user_addr       |

+---------+-----------+-----------+------------------+

|       4 | 黄百韬    | 国军      | 中国广东省梅县   |

|       5 | 张灵甫    | 国军      | 中国陕西省长安县 |

+---------+-----------+-----------+------------------+