9.1正则表达式介绍
正则表达式是用来匹配文本的特殊的串(字符集合)。
与任意语言一样,正则表达式具有你必须学习的特殊的语法和指令。
9.2使用MySQL正则表达式
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较,MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式过滤SELECT检索出的数据
注意:MySQL仅支持多数正则表达式实现的一个很小的子集。
9.2.1基本字符匹配
**输入:**SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000’ ORDER BY prod_name;
分析: 除了关键字LIKE被REGEXP替代外,这条语句非常像使用LIKE语句,他告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理
输入: SELECT prod_name FROM products WHERE prod_name REGEXP ‘.000’ ORDER BY prod_name;
分析: 这里使用正则表达式.000 。==.==是正则表达式语言中一个特殊的 字符,他表示匹配任意一个字符。
注意:
MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写( 即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字,如WHERE prod_ name REGEXP
BINARY ’ JetPack .000’。
9.2.2进行OR匹配
输入: SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000|2000’ ORDER BY prod_name;
分析: 语句中使用正则表达式1000|2000为正则表达式的OR操作符,他表示匹配其中之一,相当于OR语句。
9.2.3匹配几个字符之一
匹配任何单一字符,但是,如果你只想匹配特定的字符,可以通过指定一组用==[和]==括起来的字符来完成。
输入: SELECT prod_name FROM products WHERE prod_name REGEXP ‘[123] Ton’ ORDER BY prod_name;
分析: 这里,使用正则表达式[123] Ton。[123]定义一组字符,他的意思是匹配1或2或3,因此,1 ton 2 ton 3 ton都可以匹配且返回。
9.2.4匹配范围
集合可以用来定义要匹配的一个或多个字符,例如,下面的集合将匹 配数字0到9:
[0123456789]
为简化这种类型的集合,可使用-来定义一个范围。下面的式子功能 上等同于上述数字列表:
[0-9]
输入: SELECT prod_name FROM products WHERE prod_name REGEXP ‘[1-5]’ Ton ORDER BY pord_name;
分析: 这里使用正则表达式[1-5] Ton [1-5]定义了一个范围,这个表达式的意思是匹配1到5
9.2.5匹配特殊字符
为了匹配特殊字符,必须用\为前导。\\-表示查找-,\\.表示查找.。
SELECT vend_name FROM vendors WHERE vend_name REGEXP ' \\.' ORDER BY vend_name;
分析:
\\.匹配.,这种处理方式称之为转义
9.2.6匹配字符类
9.2.7 匹配多个实例
重复元字符
元字符 | 说明 |
---|---|
* | 0个或者多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
输入:
SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?)' ORDER BY prod_name;
分析: sticks? 匹配stick和sticks,?表示0个或1个匹配
输入:
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;
分析: [:digit:]匹配任意数字 ,{4}:确切的要求他前面的字符(任意数字),出现4次,匹配prod_name文本中包含4个任意连在一起的数字
9.2.8定位符
目前为止的所有例子都是匹配一个串中任意位置的文本,为了匹配特定位置的文本,需要使用定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:"]] | 词的结尾 |
输入:
SELECT prod_ name FROM products WHERE prod_ name REGEXP
'^[0-9\\.]' ORDER BY prod_ name ;
分析:\ ^ 匹配串的开始。因此,1只在.或任意数字为串中第 一个字符时才匹配它们。没有^,则还要多检索出4个别的行(那些中间有数字的行)。
####小技巧
简单的正则表达式测试:可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们。相应的语法如下:
这个例子显然将返回0(因为文本hello中没有数字)。
9.3小结
本章介绍了正则表达式的基础知识,学习了如何在MySQL的SELECT 语句中通过REGEXP关键字使用它们。
0-9\\. ↩︎