MySQL SQL模式匹配

MySQL提供标准的SQL模式匹配,SQL模式匹配容许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。。html

关于SQL模式匹配:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matchingmysql

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

2.SQL模式匹配容许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。;而REGEXP使用扩展正则表达式匹配列值的子串,若是被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。sql

注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操做符。数据库

看下面的例子:api

mysql> select * from tb;测试

+----+------------+-----+regexp

| id | Name       | Age |htm

+----+------------+-----+文档

|  1 | changename |  20 |

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

1 row in set (0.02 sec)

要想找出正好包含5个字符的名字,使用“_”模式字符:

mysql> select * from tb where name like '_____';

Empty set (0.61 sec)

包含10个字符时,找出了匹配结果。

mysql> select * from tb where name like '__________';

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

| id | Name       | Age |

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

|  1 | changename |  20 |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'cha';

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

| name       |

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

| changename |

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

1 row in set (0.06 sec)

 

mysql> select name from tb where name regexp 'chad';

Empty set (0.00 sec)

 

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

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

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

·         “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。

    •  若是REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不一样于LIKE模式匹配,只有与整个值匹配,模式才匹配)。

    •  为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

 

3.默认MySQL中的正则表达式匹配不区分大小写,可以使用BINARY关键字区分大小写,如

mysql> select name from tb where name regexp binary'cha';

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

| name       |

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

| changename |

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

1 row in set (0.08 sec)

 

mysql> select name from tb  where name regexp binary'Cha';

Empty set (0.00 sec)

 

四、进行OR匹配:为搜索两个串之一,使用|,以下所示:

mysql> select name from tb where name regexp 'c|a';

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

| name       |

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

| changename |

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

1 row in set (0.02 sec)

 

五、匹配几个字符之一:

匹配任何单一字符。以下所示:

mysql> select name from tb where name regexp '[ca]';

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

| name       |

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

| changename |

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

1 row in set (0.02 sec)

 

正如所见,[]是另外一种形式的OR语句。'[ca]'与’c|a’是等价的。

 

匹配除给定字符外的字符:

 mysql> select name from tb where name regexp '^[ca]';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

六、可以使用-来定义一个范围。如[1-9],[a-b]。

mysql> select name from tb where name regexp '[a-c]';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp '[w-z]';

Empty set (0.00 sec)

 

七、为了匹配特殊字符,必须用\\为前导,例如\\-,\\.等。这种处理即转义(escaping)。

多数正则表达式实现使用单个反斜杠转义特殊字符,但MYSQL要求两个(MYSQL本身解释一个,正则表达式库解释另外一个)。

\\也用来引用元字符(具备特殊含义的字符),以下表:

 

 

八、为了更方便工做,能够使用预约义的字符集,称为字符类(character class)。

mysql> select name from tb where name regexp '[[:alpha:]]';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

九、使用正则表达式重复元字符匹配多个实例:

mysql> select name from tb where name regexp 'c{1}';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'c{2}';

Empty set (0.00 sec)

 

十、定位符(为了匹配特定位置的文本):

 mysql> select name from tb where name regexp 'e$';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'a$';

Empty set (0.00 sec)



 

十一、使REGEXP起相似LIKE的做用,它们的区别在于LIKE匹配整个串而REGEXP匹配子串。利用定位符,经过用^开始每一个表达式,用$结束每一个表达式。

 

十二、简单的正则表达式测试:能够在不使用数据库表的状况下用SELECT来测试正则表达式。REGEXP检查老是返回0或1(匹配)。

 

[sql] 

mysql> select 'hello' REGEXP'[0-9]';  

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

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

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

|                      0 |  

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

1 row in set (0.00 sec)  

 

本文基于 <使用正则表达式搜索>整理造成。

官方文档:Mysql正则表达式:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html

相关文章
相关标签/搜索