模式匹配 regexp_like()
MySQL提供的另一种模式匹配使用扩展的正则表达式。在测试此类型的模式是否匹配时,请使用REGEXP_LIKE()
函数(或的REGEXP
或RLIKE
运算符,它们是的同义词REGEXP_LIKE()
)。
下表描述了扩展正则表达式的一些特征:
- .匹配任何单个字符。
- 字符类
[...]
与方括号内的任何字符匹配。例如,[abc]
匹配,b
或c
。要命名字符范围,请使用破折号。[a-z]
匹配任何字母,而[0-9]
匹配任何数字。 - *匹配零个或多个其前面事物的实例。例如,
x*
匹配任意数量的x
字符,[0-9]*
匹配任意数量的数字,以及.*
任意数量的任何东西。 - 如果正则表达式模式匹配成功,则该模式匹配成功。(这与
LIKE
模式匹配不同,后者仅在模式匹配整个值时才成功。) - 锚定的图案,使得它必须使用匹配的值的开头或结尾正在测试中,
^
在开始时或$
在图案的端部。
为了演示扩展正则表达式的工作原理,LIKE
此处显示的查询在此处被重写为use REGEXP_LIKE()
。
要查找以开头的名称b
,请使用^
匹配名称的开头:
mysql>SELECT *FROM petWHERE REGEXP_LIKE(name , '^b'); +-------- +-------- +--------- +------ +------------ +------------ + | name | owner | species | sex | birth | death | +-------- +-------- +--------- +------ +------------ +------------ + | Buffy | Harold | dog | f | 1989 -05 -13 | NULL | | Bowser | Diane | dog | m | 1979 -08 -31 | 1995 -07 -29 | +-------- +-------- +--------- +------ +------------ +------------ +
要强制正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用BINARY
关键字将字符串之一设置为二进制字符串,或指定c
match-control字符。这些查询中的每个查询都只b
在名称开头匹配小写字母:
SELECT *FROM petWHERE REGEXP_LIKE(name , '^b'COLLATE utf8mb4_0900_as_cs);SELECT *FROM petWHERE REGEXP_LIKE(name , BINARY '^b');SELECT *FROM petWHERE REGEXP_LIKE(name , '^b', 'c');
要查找以结尾的名称fy
,请使用$
匹配名称的末尾:
mysql>SELECT *FROM petWHERE REGEXP_LIKE(name , 'fy$'); +-------- +-------- +--------- +------ +------------ +------- + | name | owner | species | sex | birth | death | +-------- +-------- +--------- +------ +------------ +------- + | Fluffy | Harold | cat | f | 1993 -02 -04 | NULL | | Buffy | Harold | dog | f | 1989 -05 -13 | NULL | +-------- +-------- +--------- +------ +------------ +------- +
要查找包含的名称w
,请使用以下查询:
mysql>SELECT *FROM petWHERE REGEXP_LIKE(name , 'w'); +---------- +------- +--------- +------ +------------ +------------ + | name | owner | species | sex | birth | death | +---------- +------- +--------- +------ +------------ +------------ + | Claws | Gwen | cat | m | 1994 -03 -17 | NULL | | Bowser | Diane | dog | m | 1989 -08 -31 | 1995 -07 -29 | | Whistler | Gwen | bird | NULL | 1997 -12 -09 | NULL | +---------- +------- +--------- +------ +------------ +------------ +
由于正则表达式模式是否匹配(如果它出现在值中的任何位置),因此在上一个查询中不必在模式的任何一侧放置通配符以使其与整个值匹配,这与SQL模式一样。
要查找正好包含五个字符的名称,请使用^
和$
匹配名称的开头和结尾以及.
两者之间的五个实例:
mysql>SELECT *FROM petWHERE REGEXP_LIKE(name , '^.....$'); +------- +-------- +--------- +------ +------------ +------- + | name | owner | species | sex | birth | death | +------- +-------- +--------- +------ +------------ +------- + | Claws | Gwen | cat | m | 1994 -03 -17 | NULL | | Buffy | Harold | dog | f | 1989 -05 -13 | NULL | +------- +-------- +--------- +------ +------------ +------- +
您还可以使用(“ repeat--times ”)运算符编写上一个查询:{n}
n
mysql>SELECT *FROM petWHERE REGEXP_LIKE(name , '^.{5}$'); +------- +-------- +--------- +------ +------------ +------- + | name | owner | species | sex | birth | death | +------- +-------- +--------- +------ +------------ +------- + | Claws | Gwen | cat | m | 1994 -03 -17 | NULL | | Buffy | Harold | dog | f | 1989 -05 -13 | NULL | +------- +-------- +--------- +------ +------------ +------- +
有关正则表达式语法的更多信息,请参见“MySQL正则表达式函数”。