yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理

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]';

 

 

posted on 2016-09-18 19:06  xxxxxxxx1x2xxxxxxx  阅读(10076)  评论(0编辑  收藏  举报