MySQL 正则表达式
正则表达式是描述搜索模式的特殊字符串。它是一种强大的工具,可以使用一种简洁灵活的方式来识别基于模式的文本字符串,例如字符和单词。它使用自己的语法,可以由正则表达式处理器解释。正则表达式广泛应用于几乎所有平台,从编程语言到数据库,包括MySQL。
正则表达式使用反斜杠作为转义字符,如果使用了双反斜杠,则模式匹配时应考虑这一点。正则表达式不区分大小写。 在MySQL中,它缩写为REGEX或REGEXP 。
使用正则表达式的优点是,我们不仅限于使用LIKE运算符中的百分号(%
)和下划线(_
)来搜索字符串。正则表达式具有更多元字符,可以在执行模式匹配时提供更多灵活性和控制能力。
我们之前学过通配符。通配符允许我们获得与正则表达式类似的结果。所以我们可能会问, 为什么要学习正则表达式 ,如果我们将得到与通配符相同的结果。这是因为正则表达式允许我们以比通配符更复杂的方式搜索符合条件的数据。
语法
MySQL采用了 Henry Spencer 实现的正则表达式。 MySQL 允许我们在SQL语句中使用REGEXP运算符直接匹配模式。以下是在MySQL中使用正则表达式的基本语法示例:
SELECT column_lists FROM table_name WHERE field_name REGEXP 'pattern';
在这个语法中, column_list 表示结果集中返回的列名。 table_name 是要使用模式检索数据的表的名称。 WHERE field_name 代表执行正则表达式的列名。 REGEXP 是正则表达式运算符, pattern 是要与 REGEXP 匹配的搜索条件。我们也可以使用 >= “RLIKE” 运算符,这是 REGEXP 的同义词,结果与 REGEXP 相同。通过使用 REGEXP 而非 LIKE,我们可以避免与 LIKE 运算符混淆。
如果 WHERE field_name 中的值与模式匹配,则语句返回 true。否则,它返回 false。如果 field_name 或 pattern 中的任一值为 NULL,则结果始终为 NULL。 REGEXP 运算符的否定形式为 NOT REGEXP。
正则表达式元字符
下表显示了正则表达式中最常用的元字符和结构:
元字符 | 描述 |
---|---|
^ |
插入符 (^) 用于从搜索字符串的开头开始匹配。 |
$ |
美元符 ($) 用于从搜索字符串的末尾开始匹配。 |
. |
点 (.) 字符匹配除了换行符之外的任意单个字符。 |
[abc] |
用于匹配方括号中的任何字符。 |
[^abc] |
用于匹配方括号中未指定的任何字符。 |
* |
星号 (*) 字符匹配前面字符串的零个(0)或多个实例。 |
\+ |
加号 (+) 字符匹配前面字符串的一个或多个实例。 |
{n} |
用于匹配前面元素的 n 个实例。 |
{m, n} |
用于匹配前面元素的 m 到 n 个实例。 |
p1|p2 |
用于隔离与模式 p1 或 p2 匹配的可选项。 |
? |
问号 (?) 字符匹配前面字符串的零个(0)或一个实例。 |
[A-Z] |
用于匹配任何大写字母。 |
[a-z] |
用于匹配任何小写字母。 |
[0-9] |
用于匹配从0到9的数字。 |
[[:<:]] |
匹配单词的开头。 |
[[:>:]] |
匹配单词的结尾。 |
[:class:] |
用于匹配字符类,例如 [:alpha:] 匹配字母,[:space:] 匹配空白字符,[:punct:] 匹配标点符号,[:upper:] 匹配大写字母。 |
让我们通过以下实例来理解正则表达式:
假设我们有一个名为 student_info 的表,其中包含以下数据。我们将基于这个表的数据演示各种示例。
如果我们想要 搜索名字以”A或B”开头的学生 ,我们可以使用正则表达式和元字符,如下所示:
mysql> SELECT * FROM student_info WHERE stud_name REGEXP '^[ab]';
执行该语句,我们将得到所期望的结果。请参见下面的输出:
如果我们想要获取名字以k结尾的学生信息,我们可以使用’k$’元字符来匹配字符串的结尾,如下所示:
mysql> SELECT * FROM student_info WHERE stud_name REGEXP 'k$';
执行该语句,我们将得到期望的结果。请参见下面的输出:
如果我们想要获取名字中只包含六个字符的学生信息,我们可以使用 ‘^’ 和 ‘$’ 元字符来实现。这些字符分别匹配学生名字的开头和结尾,并且在两者之间连续重复 {6} 次的任意字符。如下面的语句所示:
mysql> SELECT * FROM student_info WHERE stud_name REGEXP '^.{6}$';
执行该语句后,我们将会得到所需的结果。请参见下方输出:
如果我们想获得科目中包含’i’字符的学生信息,可以使用以下查询语句:
mysql> SELECT * FROM student_info WHERE subject REGEXP 'i';
执行该语句,我们将获得所期望的结果。请查看下面的输出:
正则表达式函数和操作符
以下是MySQL中正则函数和操作符的列表:
名称 | 描述 |
---|---|
NOT_REGEXP | 它是REGEXP操作符的否定。 |
REGEXP | 此操作符表示字符串是否与正则表达式匹配。 |
RLIKE | 此操作符表示字符串是否与正则表达式匹配。 |
REGEXP_INSTR() | 这是一个函数,当子字符串的起始索引与正则表达式匹配时,它会给出结果。 |
REGEXP_LIKE() | 此函数表示字符串是否与正则表达式匹配。 |
REGEXP_REPLACE() | 它通过替换与正则表达式匹配的子字符串来给出结果。 |
REGEXP_SUBSTRING() | 此函数返回与正则表达式匹配的子字符串。 |
咱们详细看看所有的内容。
REGEXP、RLIKE 和 REGEXP_LIKE()
虽然这些函数和运算符返回的结果相同, REGEXP_LIKE () 通过可选参数提供了更多功能。我们可以如下使用它们:
expression REGEXP pattern
expression RLIKE pattern
REGEXP(expression, pattern[, match_type])
这些语句会输出字符串表达式是否匹配正则表达式模式。如果表达式匹配模式,则返回1。否则,返回0。下面的示例更清楚地解释了这一点。
在下面的图像中,第一个语句返回’1’,因为 ‘B’ 在A-Z的范围内。第二个语句限制了模式的范围为B-Z。因此 ‘A’ 不会匹配范围内的任何字符,MySQL会返回0。在这里我们使用了别名 match_ and not_match_ 这样返回的列会更容易理解。
REGEXP_LIKE() 参数
下面是能够修改函数输出的五个可能参数: 五个可能的参数
- c :表示区分大小写的匹配。
- i :表示不区分大小写的匹配。
- m :表示多行模式,允许字符串内换行符。默认情况下,该函数只匹配字符串的起始和结束处的换行符。
- n :用于修改点 (.) 字符,使其能够匹配换行符。
- u :表示只匹配 Unix 行尾。
示例
在此示例中,我们将 ‘c’和’i’ 作为可选参数添加,调用 区分大小写 和 不区分大小写 匹配。第一个查询输出0,因为’a’在’a-z’范围内,但不在大写字母A-Z的范围内。第二个查询输出1,因为具有不区分大小写功能。
NOT REGEXP & NOT RLIKE
他们是正则表达式运算符,用于比较指定的模式并返回不匹配的结果。如果没有找到匹配的模式,这些运算符会返回1。否则,它们会返回0。我们可以按照以下方式使用这些函数:
SELECT (expr NOT REGEXP pat);
OR
SELECT (expr NOT RLIKE pat);
示例
下面的语句返回0,因为在给定范围中找到了 ‘a’ 。
mysql> SELECT ('a' NOT REGEXP '[a-z]') AS not_match;
这是输出的结果:
REGEXP_INSTR()
这是一个函数,当子字符串表达式的起始索引与模式匹配时,它会给出一个结果。如果没有找到匹配项,它将返回0。如果表达式或模式中有一个为 NULL ,它将返回NULL。在这里,索引从1开始。
REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
这个函数使用各种可选参数,如pos、occurrence、return_option、match_type等。
示例
假设我们想要获得子字符串 ‘a’ 在表达式 (a b c d e f a) 中的索引位置。第一次查询返回1,因为我们没有设置任何可选参数,这是字符串的第一个索引。第二次查询返回13,因为我们使用了可选参数occurrence修改了查询。
SELECT REGEXP_INSTR('a b c d e f a', 'a', 1, 1, 0) AS start_index_;
SELECT REGEXP_INSTR('a b c d e f a', 'a', 1, 2, 0) AS a_index_2;
REGEXP_REPLACE()
该函数通过匹配字符来替换指定的字符串字符,并返回结果字符串。如果未找到任何表达式、模式或可替换的字符串,则会返回 NULL。可以按照以下方式使用该函数:
SELECT REGEXP_REPLACE ('expression', 'character', 'replace_character');
这个replace字符使用了可选参数,如pos、occurrence和match_type。
例子
这个语句将’tutorials’模式替换为’javat’模式 。
mysql> SELECT REGEXP_REPLACE ('tutorialspoint', 'tutorials', 'javat') AS replaced;
这是输出结果:
REGEXP_SUBSTRING()
该函数返回与指定模式匹配的表达式的子字符串。如果找不到表达式或指定模式甚至没有匹配,则返回NULL。此函数的使用方法如下:
SELECT REGEXP_SUBSTR ('expr', 'pattern');
模式使用可选参数,如pos,occurrence和match_type。
示例
此语句返回给定范围的第三个出现的’point’模式 .
mysql> SELECT REGEXP_SUBSTR ('java t point', '[a-z]+', 2, 3) AS substring;
这里是输出: