mysql搜索名字语法_MySQL使用正则表达式搜索

引言

在MySQL中,我们常用

LIKE

关键词对文本进行搜索,但是

LIKE

关键词的搜索能力有限,当随着搜索条件越来越复杂,

LIKE

关键词进行搜索的复杂度会随之增加,因此,在必要的时候,我们需要使用正则表达式进行搜索。

正则表达式是用来匹配文本的特殊的字符集合,正则表达式的功能十分强大。如:可以从一个文本文件中提取电话号码;可以查找名字中有数字的所有文件;可以在一个文本块中找到所有重复的单词;可以替换一个页面中所有的URL;等等。

一、正则表达式基本语法

在MySQL中使用正则表达式搜索,需要使用关键词

REGEXP

,其基本语法与

LIKE

关键词一致:

select col from table1 where col regexp 'abc';

二、正则表达式搜索的优点

在上面的例子中,我们似乎可以使用

LIKE

关键词完成相同功能:

select col from table1 where col like 'abc';

其实,在上面的例子中,这两句话返回的结果可能一致,但也可能不一致,这可以算是正则表达式搜索的一个优点。

在LIKE关键词搜索中,LIKE关键词匹配整个列,如果被匹配的文本在列值中出现(即只是这个列的值得一部分),LIKE关键词将不会找到它,相应的行也不会返回(除非使用通配符);而正则表达式搜索时,REGEXP在列值中进行匹配,只要被匹配的文本在列值中出现,REGEXP将会找到它,并且返回该行。

ps:当然,regexp也能实现和like关键词一样的功能,只要使用定位符

“^”

“$”

即可。后面会讲到。

三、MySQL正则表达式搜索

正则表达式搜索的强大之处在于他们非常丰富的操作符。

(1)基本字符匹配:

select col from table1 where col regexp 'abc'

匹配包含词abc的行

select col from table1 where col regexp '.abc'

.

是正则表达式语言中的一个特殊字符,它表示匹配任意一个字符,类似于like关键词搜索中的 _

(2)进行OR匹配:

正则表达式语言中

“|”

作为or操作符,表示匹配其中之一。

select col from table1 where col regexp 'abc|def|ghi';

(3)匹配几个字符之一:

如果要匹配一组特定的字符,可以使用中括号([ ])将字符括起来。

select col from table1 where col regexp '[123]abc';

将返回含有 1abc 或 2abc 或 3abc 的行。

(4)范围匹配:

[0-9]

相当于

[0123456789]

,可以匹配任意数字;同理

[a-z]

可以匹配任意字母。

select col from table1 where col regexp '[1-3]abc';

将返回含有 1abc 或 2abc 或 3abc 的行。

(5)匹配特殊字符:

MySQL正则表达式中,匹配特殊字符需要使用"\\"为前导,这种处理叫做

转义

,相当于将具有特殊含义的字符转换为字符本身。在匹配所有特殊字符时,都要进行转义。

select col from table1 where col regexp '\\_';

返回含有_字符的行。

注意:

1.如果需要匹配反斜杠 \ 本身,则需要使用三个反斜杠\\\。

2.多数正则表达式实现使用单个反斜杠转义特殊字符,但是MySQL要求两个反斜杠,实际是MySQL自己解释一个,正则表达式库解释一个。

“\\”也用来引用元字符(具有特殊含义的字符):

元字符

说明

\\f

换页

\\n

换行

\\r

回车

\\t

制表

\\v

纵向制表

(6)匹配字符类:

如果我们要匹配所有数字、所有字母等内容,可以使用字符类来进行简化操作;

说明

[:alnum:]

任意字母和数字(同[a-zA-Z0-9])

[:alpha:]

任意字符(同[a-zA-Z])

[:blank:]

空格和制表(同[\\t])

[:cntrl:]

ASCII控制字符(ASCII 0到31和127)

[:digit:]

任意数字(同[0-9])

[:graph:]

与[:print:]相同,但不包括空格

[:lower:]

任意小写字母(同[a-z])

[:print:]

任意可打印字符

[:punct:]

既不在[:alnum:]又不在[:cntrl:]中的任意字符

[:space:]

包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])

[:upper:]

任意大写字母(同[A-Z])

[:xdigit:]

任意十六进制数字(同[a-fA-F0-9])

例如:

select col from table1 where col regexp '[[:digit:]]abc'

匹配任意一个数字和abc连起来的词

(7)匹配多个实例:

如果要对匹配的文本的重复次数进行控制,需要使用重复元字符。

元字符

说明

*

0个或多个匹配

+

1个或多个匹配(等于{1,})

0个或1个匹配)(等于{0,1})

{n}

n次匹配

{n,}

不少于n次匹配

{m,n}

匹配数目的范围,n最大值不超过255

例如:

select col from table1 where col regexp '[[:digit:]]{4}';

匹配连在一起的4位数字。

(8)定位符:

如果要匹配在文本中特定位置的字符,需要用到定位符。

元字符

说明

^

文本的开始处

$

文本的结尾处

[[:<:>

词的开始处

[[:>:]]

词的结尾处

注意^的双重用途:

^有两种用法,在集合中([ ]),用它来否定该集合,否则用来指定字符集的开始。

例如:

select col from table1 where col regexp '^[0-9\\.]';

匹配以一个数字或小数点开头的文本。

select col from table1 where col regexp '^abc$';

#相当于

select col from table1 where col like 'abc';

四、MySQL正则表达式搜索注意事项

MySQL中的正则表达式匹配不区分大小写,如果需要区分大小写,需要用

BINARY

关键字,如

where col regexp binary ‘Abc’

正则表达式搜索效率较低,搜索速度较慢,在使用正则表达式之前,应该进行简单测试。如

select ‘hello’ from ‘[0-9]’;

如果匹配将返回1,否则返回0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值