搜索高阶技巧:利用正则表达式搜索更多相关信息

2020年7月15日 评论 726

常用搜索功能的小伙伴应该经常有这样一个需求,想搜索某句话,但中间某几个字忘了,普通的搜索功能肯定就无法满足这个要求了。
这个时候就可以考虑使用正则表达式来实现跨字符串搜索。今天就让我们一起来学习下这个进阶技巧吧!

正则表达式介绍:

正则表达式是用来匹配文本的特殊的串(字符集合)。

所有种类的程序设计语言,文本编辑器,操作系统等都支持正则表达式。

基本字符匹配:

SELECT prod_name

FROM products

WHERE prod_name REGEXP '.000'

ORDER BY prod_name;

. 是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符,因此1000和2000都能匹配。

LIKE匹配整个列,如果配匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)

REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回,这是一个非常重要的差别。

匹配不区分大小写:如果要区分大小写,要用BINARY关键字。如 WNERE prod_name REGEXP BINARY 'JecPack .000'。

进行OR匹配:

为搜索两个串之一(或者为另一个串),使用 |

SELECT prod_name

FROM products

WHERE prod_name REGEXP '1000|2000'

ORDER BY prod_name;

两个以上的OR条件:可以给出两个以上的OR条件。如'1000|2000|3000|'.

匹配几个字符之一:

如果你只想匹配特定的字符,怎么办?可通过指定一组用 [和] 括起来的字符来完成。

SELECT prod_name

FROM products

WHERE prod_name REGEXP '[123] Ton'

ORDER BY prod_name;

其中'[123] Ton'是'[1|2|3] Ton'的简写。

字符集也可以被否定。为否定一个字符集,在集合的开始出放置一个^即可。如[^123]

匹配范围:

集合可用来定义要匹配的一个或多个字符。例如,下列的集合将匹配0到9,

[0123456789]为简化这中写法,可写为[0-9]。范围不限于完整的集合。[1-3],[6-9]也是合法的。此外。范围不一定是数值, [A-Z] 匹配任意字母字符。

SELECT prod_name

FROM products

WHERE prod_name REGEXP '[1-5] Ton'

ORDER BY prod_name;

匹配特殊字符:

例如要找出包含.字符的值,怎么搜索?为了匹配特殊字符,必须用 \\ 为前导。\\-表示查找-。

SELECT vend_name

FROM vendors

WHERE vend_name REGEXP '\\ .'

ORDER BY vend_name;

这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须用这种方式转义。

\\ 也用来引用元字符(含有特殊意义的字符),如下所列

\\ f   换页

\\ n  换行

\\ r   回车

\\ t   制表

\\ v  纵向制表

为了匹配反斜杠本身,必须使用\\\

\或\\,多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身,但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。

匹配字符类:

存在找出你自己经常使用的数字,所有字母字符或所有数字字母等的匹配。

字符类(预定义字符集):

说明

[:alnum:]

任意字母和数字

[:alpha:]

任意字符

[:blank:]

空格和制表

[:cntrl:]

ASCII控制字符

[:digit:]

任意数字

[:graph:]

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

[:lower:]

任意小写字母

[:print:]

任意可打印字符

[:punct:]

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

[:space:]

包括空格在内的任意空白字符

[:upper:]

任意大写字母

[:xdigit:]

任意十六进制数字

匹配多个实例:

元字符

说明

*

0个或多个匹配

+

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

?

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

{n}

指定数目的匹配

{n, }

不少于指定数目的匹配

{n,m}

匹配数目的范围(m不超过255)

SELECT prod_name

FROM products

WHERE prod_name REGEXP '\\([0-9] sticks?\\)'

ORDER BY prod_name;

正则表达式\\([0-9] sticks?\\)需要解说一下。\\(匹配),

[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick 和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\\)匹配)。没有?,匹配stick和sticks会非常困难。

定位符:

目前为止的所有例子都是匹配一个串中任意为止的文本。为了匹配特定为止的文本,需要使用如下列出的定位符。

元字符

说明

^

文本的开始

$

文本的结尾

[[:<:]]

词的开始

[[:>:]]

词的结尾

SELECT prod_name

FROM products

WHERE prod_name REGEXP '^[0-9\\]'

ORDER BY prod_name;

使用参考案例:

[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。

abc$匹配字母 abc 并以 abc 结尾,$为匹配输入字符串的结束位置。
当我们查找字符串时,下面的字符串将都将被查找出来。
123abc123452323abc
下面的字符串将因为没有匹配该正则表达式而无法查找。
a123abc 【“^”匹配失败】123abc2 【“$”匹配失败】abc 【“+”匹配失败】

匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: