【MySQL必知必会】:用正则表达式进行搜索

132 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

一、前言

大家好,今天文章的内容是:

  • 【用正则表达式进行搜索】

二、内容

2.1、什么是正则表达式?

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

正则表达式用于匹配文本,将一个模式与一个文本串进行比较。为了更好地进行数据过滤,我们可以在WHERE子句中使用正则表达式来过滤SELECT检索出的数据。

2.2、REGEXP 操作符

在MySQL中,我们使用REGEXP操作符来进行正则表达式匹配。

LIKE操作符一样,REGEXP操作符也有类似的搜索模式,称为正则模式,下面记录MySQL中常用的正则模式。

(1).

.是正则表达式语言中的一个特殊字符,用于匹配任意一个字符(除\n之外)。

(2)|

|操作符用于匹配指定串的其中之一,含义类似于OR,比如a1|a2|a3正则模式用于匹配a1a2a3

(3)[···]

我们可以使用字符集合来匹配其中包含的任意一个字符,即匹配特定的字符。

所谓字符集合,就是可以通过一组[]来将指定匹配的字符括起来,用于表示括号内的字符只要匹配任意一个即可,效果也类似于OR语句。比如正则模式[123]相当于1|2|3,意思是匹配1或2或3。

(4)[^...]

如果在字符集合的开始位置放置一个字符^,效果则会完全相反,即否定一个字符集。

比如正则模式[123]表示匹配字符1、2或3,而[^123]则表示匹配这些字符之外的任何字符。

(5)-

集合可以用来定义要匹配的一个或多个字符,也就是指定匹配范围,而这里需要一个操作符-来定义一个范围。

比如正则模式[0123456789]用于匹配数字0到9中的任意一个字符,那么可以用[0-9]来代替,效果是一样的。

备注:

  • 指定匹配范围不一定是数值,也可以是字母,比如[a-z]表示匹配任意一个字母。

(6)\

为了匹配像.-以及|等具有特殊含义的字符时,我们会使用所谓的转义(escaping),即使用\\作为前导。

比如:

  • \\.用于查找字符.
  • \\-用于查找字符-
  • \\|用于查找字符|
  • \\\用于查找字符\

另外,\\也可以用来引用元字符,即具有特殊含义的字符。如下所示:

  • \\n:换行
  • \\f:换页
  • \\r:回车
  • \\t:制表
  • \\v:纵向制表

2.3、character class

在 MySQL 中,可以使用字符类(character class)来匹配一些预定义好了的字符集。

具体记录如下;

  • [:alnum:]:任意字母和数字(同[a-zA-Z0-9]
  • [:alpha:]:任意字母(同[a-zA-Z]
  • [:digit:]:任意数字(同[0-9]
  • [:xdigit:]:任意十六进制数字(同[a-fA-F0-9]
  • [:lower:]:任意小写字母(同[a-z]
  • [:upper:]:任意大写字母(同[A-Z]
  • [:blank:]:空格和制表(同[\\t]
  • [:print:]:任意可打印字符
  • [:graph:]:与[:print:]相同,但不包括空格。
  • [:cntrl:]:ASCII 控制字符(ASCII 0到31和127)
  • [:punct:]:既不在[:alnum:]也不在[:cntrl:]中的任意字符。

2.4、重复元字符

上述所记录的正则模式都是单次匹配,如果存在一个匹配,则该行会被检索到。

但是,我们可以利用重复元字符来实现多个实例的匹配,即可以对匹配的数目进行更强的控制。

下面是重复元字符的记录:

  • {n}:指定数目n的匹配,即匹配确定的n次。
  • {n,}:不少于指定数目n的匹配。
  • {n,m}:匹配数目的范围,即最少匹配n次且最多匹配m次。
  • ?0个或1个匹配(同{0,1}
  • *0个或多个匹配(同{0,}
  • +1个或多个匹配(同{1,}

2.5、定位符

我们可以使用定位符来匹配特定位置的文本。

记录如下;

  • ^:匹配文本的开始位置。
  • $:匹配文本的结束位置。
  • [[:<:]]:匹配词的结束位置。
  • [[:>:]]:匹配词的结束位置。

注意:

特殊字符^有两个用途,一方面在字符集合的开始位置放置^可以起到否定字符集的作用,另一方面,^可以用于匹配串的开始位置。


三、后话

好了,今天的文章内容就到这里,感谢观看。