6.5 使用REGEXP关键字进行模式匹配
在MySQL数据库中,还提供了一种更加灵活的模式匹配方法,就是使用REGEXP关键字对字符串进行模式匹配。使用REGEXP关键字对字符串进行模式匹配,只要是在被匹配的字符串中含有与匹配模板中相匹配的子串,就被认为是模式匹配。其返回值就为TRUE。
在MySQL数据库中,使用REGEXP关键字对字符串进行模式匹配时,可以使用一些模式匹配修饰符对模式匹配进行测试。
❑^:用来匹配字符串的开始。
❑$:用来匹配字符串的结尾。
❑[]:在方括号中的任何字符都可以匹配。例如[abc]表示匹配方括号中的字符a、字符b或者是字符c。
❑-:连字符用来表示字符匹配的范围。例如[a-z]表示匹配方括号中字符a到字符z中的任何一个字符。
❑+:表示用于匹配的该字符在被匹配的字符串中出现至少一次或者多次。
❑*:表示用于匹配的该字符在被匹配的字符串中出现零次或者多次。
❑():在圆括号中的内容将被看做一个整体。例如(abc),表示匹配样式(abc)的字符串是abc。
❑{m}:其中整数m表示花括号前的字符串需要出现的次数。例如{abc}{2}表示匹配样式{abc}{2}的字符串是abcabc。
下面来看一个使用REGEXP关键字的例子。
例6.17 查询学生信息表中姓王的所有学生的信息(使用REGEXP关键字)。
SELECT stuID,stuName,age,sex,birth
FROM T_student
WHERE stuName REGEXP '^王'
这里使用的是REGEXP关键字查询学生信息表中姓王的所有学生的信息。使用REGEXP关键字取代例6.15中的LIKE关键字。在REGEXP关键字后使用“^”符号表示匹配的表示学生姓名的字符串是以“王”开头的。其查询结果如图6.16所示。
图6.16 查询学生信息表中姓王的所有学生的信息(使用REGEXP关键字)
这条SQL语句是从学生信息表中选择所有以“王”字开头的学生信息。这里的WHERE子句中的REGEXP '^王'表示会匹配任何一个以“王”字开头的所有学生的信息。无论这个姓王的学生的名字是两个字还是三个字,都会被检索出来。其查询结果与例6.15中的查询结果相同。
使用REGEXP关键字还可以对字符串进行模式匹配的测试,测试子串是否与被匹配的字符串匹配。语法格式如下:
string REGEXP pattern_string
该关键字的功能是如果测试的子串与被匹配的字符串匹配,则返回值为1,如果测试的子串与被匹配的字符串不匹配,则返回的值为0。其中,参数string是表示用来与匹配模板进行匹配的测试子串;参数pattern_string表示被匹配的字符串。下面来看一个使用REGEXP关键字对字符串进行模式匹配测试的例子。
例6.18 对字符串进行模式匹配测试。
SELECT 'agf' REGEXP '[a-d]+','banana' REGEXP '(ana){2}'
在这段SELECT语句中,一共对两个字符串的模式匹配进行了测试。第一个用来测试字符串agf是否与模式[a-d]+进行匹配,第二个用来测试字符串banana是否与模式(ana){2}进行匹配。其查询结果如下所示。
+--------------------------+--------------------------+--------------------------+ | 'agf' REGEXP '[a-d]+' | 'banana' REGEXP '(ana){2}' | +--------------------------+--------------------------+--------------------------+ | 1 | 0 |
从查询结果看,第一个模式匹配测试返回的值为1,第二个模式匹配测试返回的值为0。即第一个模式匹配的测试返回的结果为TRUE,第二个模式匹配测试返回的结果为FALSE。读者可以考虑一下这两个模式匹配的测试结果是如何产生的。
提示 模式[a-d]+表示匹配方括号中的任何一个字符一次或者多次,模式(ana){2}表示匹配字符串ana应该出现两次。
在MySQL数据库中,也可以使用NOT REGEXP关键字进行模式匹配,其用法与REGEXP关键字的用法相同,意义和REGEXP关键字相反。即如果测试的子串与被匹配的字符串匹配,则返回值为0,如果测试的子串与被匹配的字符串不匹配,则返回的值为1。