轻松上手MYSQL:精通正则表达式,数据匹配不再难!

🌈 个人主页: danci_

🔥 系列专栏: 《设计模式》《MYSQL》

💪🏻 制定明确可量化的目标,坚持默默的做事。


✨欢迎加入探索MYSQL正则表达式函数之旅✨

👋 大家好!文本学习和探索MYSQL正则表达式函数。👋 正则表达式,作为数据库查询的利器,在处理复杂数据匹配时无疑是MySQL用户的得力助手。《MySQL正则表达式》将为您揭开这一强大工具的面纱,带您从基础入门,逐步掌握高级技巧。无论是文本搜索、数据筛选还是复杂模式匹配,正则表达式都能为您的查询增添无限可能。准备好探索这一神奇语言了吗?让我们一起进入MySQL正则表达式的世界,发现数据操作的新维度。

目录

一、REGEXP操作符

[二、NOT REGEXP操作符](#二、NOT REGEXP操作符)

三、RLIKE操作符

[四、NOT RLIKE操作符](#四、NOT RLIKE操作符)

五、REGEXP_LIKE函数

六、REGEXP_REPLACE函数

七、REGEXP_INSTR函数

八、REGEXP_SUBSTR函数


一、REGEXP操作符

在 MySQL 中, REGEXP 操作符检查一个字符串和一个正则表达式是否匹配。

REGEXP 操作符等同于 RLIKE 操作符和 REGEXP_LIKE() 函数。REGEXP 不区分大小写。

NOT REGEXP 操作符是 REGEXP 操作符的否定操作。

语法:

sql 复制代码
str REGEXP regexp

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。

返回值:

  • 若字符串 str 和正则表达式 regexp 匹配,返回 1,否则返回 0。
  • 若任意一个参数为 NULL,返回 NULL。

这里列出了几个常见的 REGEXP示例:

sql 复制代码
SELECT
    'hello' REGEXP '^[a-z]+$',
    'hello' REGEXP '^[A-Z]+$',
    '12345' REGEXP '[0-9]+$',
    '12345' REGEXP '^\\d+$',
    '123ab' REGEXP '^\\d*$',
    '123ab' REGEXP '^.*$'

输出如下:

sql 复制代码
'hello' REGEXP '^[a-z]+$': 1
'hello' REGEXP '^[A-Z]+$': 1
 '12345' REGEXP '[0-9]+$': 1
  '12345' REGEXP '^\\d+$': 1
  '123ab' REGEXP '^\\d*$': 0
    '123ab' REGEXP '^.*$': 1

二、NOT REGEXP操作符

在 MySQL 中, NOT REGEXP 操作符检查一个字符串和一个正则表达式是否不匹配。

NOT REGEXP 操作符是 REGEXP 操作符的否定操作。NOT REGEXP 不区分大小写。

语法:

sql 复制代码
str NOT REGEXP regexp

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。

返回值:

  • 若字符串 str 和正则表达式 regexp 不匹配,返回 1,否则返回 0。
  • 若任意一个参数为 NULL,返回 NULL。

这里列出了几个常见的 NOT REGEXP 示例:

sql 复制代码
SELECT
    'hello' NOT REGEXP '^[a-z]+$',
    'hello' NOT REGEXP '^[A-Z]+$',
    '12345' NOT REGEXP '[0-9]+$',
    '12345' NOT REGEXP '^\\d+$',
    '123ab' NOT REGEXP '^\\d*$',
    '123ab' NOT REGEXP '^.*$'

输出如下:

sql 复制代码
'hello' NOT REGEXP '^[a-z]+$': 0
'hello' NOT REGEXP '^[A-Z]+$': 0
 '12345' NOT REGEXP '[0-9]+$': 0
  '12345' NOT REGEXP '^\\d+$': 0
  '123ab' NOT REGEXP '^\\d*$': 1
    '123ab' NOT REGEXP '^.*$': 0

**三、**RLIKE操作符

在 MySQL 中, RLIKE 操作符检查一个字符串和一个正则表达式是否匹配。

RLIKE 操作符等同于 REGEXP 操作符和 RLIKE_LIKE() 函数。RLIKE 不区分大小写。

语法:

sql 复制代码
str RLIKE regexp

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。

返回值:

  • 若字符串 str 和正则表达式 regexp 匹配,返回 1,返回 0。
  • 若任意一个参数为 NULL,返回NULL。

这里列出了几个常见的 RLIKE 示例:

sql 复制代码
SELECT
    'hello' RLIKE '^[a-z]+$',
    'hello' RLIKE '^[A-Z]+$',
    '12345' RLIKE '[0-9]+$',
    '12345' RLIKE '^\\d+$',
    '123ab' RLIKE '^\\d*$',
    '123ab' RLIKE '^.*$'

输出:

sql 复制代码
'hello' RLIKE '^[a-z]+$': 1
'hello' RLIKE '^[A-Z]+$': 1
 '12345' RLIKE '[0-9]+$': 1
  '12345' RLIKE '^\\d+$': 1
  '123ab' RLIKE '^\\d*$': 0
    '123ab' RLIKE '^.*$': 1

四、NOT RLIKE操作符

在 MySQL 中, NOT RLIKE 操作符检查一个字符串是否和一个正则表达式不匹配。

NOT RLIKE 操作符是 RLIKE 操作符的否定操作。

语法:

sql 复制代码
str NOT RLIKE regexp

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。

返回值:

  • 若字符串 str 和正则表达式 regexp 不匹配,返回 1,否则返回 0。
  • 若任意一个参数为 NULL,NULL。

这里列出了几个常见的 NOT RLIKE 示例

sql 复制代码
SELECT
    'hello' NOT RLIKE '^[a-z]+$',
    'hello' NOT RLIKE '^[A-Z]+$',
    '12345' NOT RLIKE '[0-9]+$',
    '12345' NOT RLIKE '^\\d+$',
    '123ab' NOT RLIKE '^\\d*$',
    '123ab' NOT RLIKE '^.*$'

输出:

sql 复制代码
'hello' NOT RLIKE '^[a-z]+$': 0
'hello' NOT RLIKE '^[A-Z]+$': 0
 '12345' NOT RLIKE '[0-9]+$': 0
  '12345' NOT RLIKE '^\\d+$': 0
  '123ab' NOT RLIKE '^\\d*$': 1
    '123ab' NOT RLIKE '^.*$': 0

五、REGEXP_LIKE函数

MySQL REGEXP_LIKE() 函数检查一个字符串是否和一个正则表达式是否匹配。

REGEXP 和 RLIKE 操作符等同于 REGEXP_LIKE() 函数。

默认情况下, REGEXP_LIKE() 函数执行不区分大小写的匹配。

注:MYSQL8支持此函数,MYSQL5版本不支持此函数**。**

语法:

sql 复制代码
REGEXP_LIKE(str, regexp)
REGEXP_LIKE(str, regexp, mode)

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。
  • mode:可选的。执行匹配采用的模式。可使用以下其中一个或多个:
    • c: 区分大小写
    • i: 不区分大小写
    • m: 多行匹配模式
    • n: 点 . 可以匹配行结束
    • u: 仅限 unix 行结尾
  • 如果匹配模式存在矛盾的选项,则以最右边的为准。

返回值:

  • 若字符串 str 和正则表达式 regexp 匹配,返回 1,否则返回 0。
  • str 或者 regexpNULL,返回 NULL

这里列出了几个常见的 REGEXP_LIKE() 示例:

sql 复制代码
SELECT
    REGEXP_LIKE('hello', '^[a-z]+$'),
    REGEXP_LIKE('hello', '^[A-Z]+$'),
    REGEXP_LIKE('12345', '[0-9]+$'),
    REGEXP_LIKE('12345', '^\\d+$'),
    REGEXP_LIKE('123ab', '^\\d*$'),
    REGEXP_LIKE('123ab', '^.*$')

输出:

sql 复制代码
     REGEXP_LIKE('hello', '^[a-z]+$'): 1
     REGEXP_LIKE('hello', '^[A-Z]+$'): 1
      REGEXP_LIKE('12345', '[0-9]+$'): 1
       REGEXP_LIKE('12345', '^\\d+$'): 1
       REGEXP_LIKE('123ab', '^\\d*$'): 0
         REGEXP_LIKE('123ab', '^.*$'): 1

可以将匹配模式设置为 'c' 来启用匹配时区分大小写(不区分大小写是 i ):

sql 复制代码
SELECT REGEXP_LIKE('hello', '^[A-Z]+$', 'c');

输出:

sql 复制代码
+---------------------------------------+
| REGEXP_LIKE('hello', '^[A-Z]+$', 'c') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+

六、REGEXP_REPLACE函数

MySQL REGEXP_REPLACE() 函数在一个字符串中使用新内容替换一个和指定的正则表达式匹配的内容。

默认情况下, REGEXP_REPLACE() 函数执行不区分大小写的匹配。

注:MYSQL8支持此函数,MYSQL5版本不支持此函数**。**

语法:

sql 复制代码
REGEXP_REPLACE(str, regexp, replacement)
REGEXP_REPLACE(str, regexp, replacement, position)
REGEXP_REPLACE(str, regexp, replacement, position, occurrence)
REGEXP_REPLACE(str, regexp, replacement, position, occurrence, mode)

参数说明:

  • str:必需的。一个字符串。
  • egexp:必需的。正则表达式。
  • replacement:必需的。用来替换的字符串。
  • position:可选的。开始搜索的起始位置。默认为从头开始。
  • occurrence:可选的。替换第几次匹配的内容。默认为替换所有匹配的内容。
  • mode:可选的。执行匹配采用的模式。可使用以下其中一个或多个:
    • c: 区分大小写
    • i: 不区分大小写
    • m: 多行匹配模式
    • n: 点 . 可以匹配行结束
    • u: 仅限 unix 行结尾
  • 如果匹配模式存在矛盾的选项,则以最右边的为准。

返回值:

  • str 中使用 replacement 替换和正则表达式 regexp 匹配的内容,并返回替换后的结果。
  • str, regexp 或者 replacementNULL,返回 NULL

这里列出了几个常见的 REGEXP_REPLACE() 示例:

sql 复制代码
+-------------------------------------------------------+
| SELECT REGEXP_REPLACE('123 abc 456 def', '\\s+', '-') |
+-------------------------------------------------------+
| 123-abc-456-def                                       |
+-------------------------------------------------------+
sql 复制代码
+-------------------------------------------------------------+
| SELECT REGEXP_REPLACE('123 abc 456 def', '\\d+', 'X', 1, 2) |
+-------------------------------------------------------------+
| 123 abc X def                                               |
+-------------------------------------------------------------+

七、REGEXP_INSTR函数

MySQL REGEXP_INSTR() 函数从一个字符串中搜索和指定模式匹配的子串并返回的子串的索引(注:第一个位置是1,不是0)。

默认情况下, REGEXP_INSTR() 函数执行不区分大小写的匹配。

注:MYSQL8支持此函数,MYSQL5版本不支持此函数**。**
语法:

sql 复制代码
REGEXP_INSTR(str, regexp)
REGEXP_INSTR(str, regexp, position)
REGEXP_INSTR(str, regexp, position, occurrence)
REGEXP_INSTR(str, regexp, position, occurrence, return_option)
REGEXP_INSTR(str, regexp, position, occurrence, return_option, mode)

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。
  • position:可选的。开始搜索的起始位置。默认为 1
  • occurrence:可选的。第几次匹配的内容。默认为 1
  • return_option:可选的。指定返回哪一种位置索引。如果为 0,返回匹配的子串的第一个字符的位置索引;如果为 1,返回匹配的子串的后面的位置索引。默认为 0.
  • mode:可选的。执行匹配采用的模式。可使用以下其中一个或多个:
    • c: 区分大小写
    • i: 不区分大小写
    • m: 多行匹配模式
    • n: 点 . 可以匹配行结束
    • u: 仅限 unix 行结尾
  • 如果匹配模式存在矛盾的选项,则以最右边的为准。

返回值:

  • 从一个字符串 str 中搜索和指定模式 regexp 匹配的子串并返回的子串的索引。如果没有匹配到,则返回 NULL
  • str 或者 regexpNULL,返回 NULL

这里列出了几个常见的 REGEXP_INSTR() 示例:

  • 匹配第一个数字(或者连续数字)的索引:
sql 复制代码
+------------------------------------------------+
| SELECT REGEXP_INSTR('123 abc 456 def', '\\d+') |
+------------------------------------------------+
|                                              1 |
+------------------------------------------------+
  • 匹配第二个数字(或者连续数字)的索引:( 第一个处为连续数字)
sql 复制代码
+------------------------------------------------------+
| SELECT REGEXP_INSTR('123 abc 456 def', '\\d+', 1, 2) |
+------------------------------------------------------+
|                                                    9 |
+------------------------------------------------------+
  • 匹配第一个数字(或连续数字)后的索引:
sql 复制代码
+---------------------------------------------------------+
| SELECT REGEXP_INSTR('123 abc 456 def', '\\d+', 1, 1, 1) |
+---------------------------------------------------------+
|                                                       4 |
+---------------------------------------------------------+
  • 执行采用模式匹配
sql 复制代码
-- 区分大小写
+--------------------------------------------------------------+
| SELECT REGEXP_INSTR('123 aaa 456 aaa', 'A{3}', 1, 1, 0, 'c') |
+--------------------------------------------------------------+
|                                                            0 |
+--------------------------------------------------------------+
-- 不区分大小写
+--------------------------------------------------------------+
| SELECT REGEXP_INSTR('123 aaa 456 aaa', 'A{3}', 1, 1, 0, 'i') |
+--------------------------------------------------------------+
|                                                            5 |
+--------------------------------------------------------------+

八、REGEXP_SUBSTR函数

MySQL REGEXP_SUBSTR() 函数从一个字符串获取和指定模式匹配的子串并返回。

默认情况下, REGEXP_SUBSTR() 函数执行不区分大小写的匹配。

注:MYSQL8支持此函数,MYSQL5版本不支持此函数**。**

语法:

sql 复制代码
REGEXP_SUBSTR(str, regexp)
REGEXP_SUBSTR(str, regexp, position)
REGEXP_SUBSTR(str, regexp, position, occurrence)
REGEXP_SUBSTR(str, regexp, position, occurrence, mode)

参数说明:

  • str:必需的。一个字符串。
  • regexp:必需的。正则表达式。
  • position:可选的。开始搜索的起始位置。默认为 1
  • occurrence:可选的。第几次匹配的内容。默认为 1
  • mode:可选的。执行匹配采用的模式。。可使用以下其中一个或多个:
    • c: 区分大小写
    • i: 不区分大小写
    • m: 多行匹配模式
    • n: 点 . 可以匹配行结束
    • u: 仅限 unix 行结尾
  • 如果匹配模式存在矛盾的选项,则以最右边的为准。

返回值:

  • str 中搜索和正则表达式 regexp 匹配的子字符串并返回。如果没有匹配到,则返回 NULL
  • str 或者 regexpNULL,返回 NULL

这里列出了几个常见的 REGEXP_INSTR() 示例:

  • 以下语句用来找出字符串 '123 abc 456 def' 中的第一组连续的数字:
sql 复制代码
+-------------------------------------------------+
| SELECT REGEXP_SUBSTR('123 abc 456 def', '\\d+') |
+-------------------------------------------------+
| 123                                             |
+-------------------------------------------------+
  • 如果想找出字符串 '123 abc 456 def' 中的第二组连续的数字,请使用下面的语句:
sql 复制代码
+--------------------------------------------------------+
| SELECT REGEXP_SUBSTR('123 abc 456 def', '\\d+', 1, 2); |
+--------------------------------------------------------+
| 456                                                    |
+--------------------------------------------------------+
  • 执行采用模式匹配:
sql 复制代码
-- 区分大小写
+------------------------------------------------------------+
| SELECT REGEXP_SUBSTR('123 aaa 456 aaa', 'A{3}', 1, 1, 'c') |
+------------------------------------------------------------+
|                                                            |
+------------------------------------------------------------+
-- 不区分大小写
+------------------------------------------------------------+
| SELECT REGEXP_SUBSTR('123 aaa 456 aaa', 'A{3}', 1, 1, 'i') |
+------------------------------------------------------------+
| aaa                                                        |
+------------------------------------------------------------+

好了,今天分享到这里。希望你喜欢这次的探索之旅!不要忘记 "点赞" 和 "关注" 哦,我们下次见!🎈

相关推荐
架构师专栏8 个月前
SpringBoot 接口:响应时间优化9个技巧!
性能优化·springboot·异步处理·缓存机制·数据库查询优化