MySQL中的正则

发布于:2024-06-21 ⋅ 阅读:(104) ⋅ 点赞:(0)

正则表达式(SQL中的应用)

正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串的强大工具。在MySQL中,正则表达式可以用于模糊查询和数据清洗,极大地提升了数据处理的灵活性和效率。本文将详细介绍正则表达式在MySQL中的应用,包括模糊查询和数据清洗的具体实现。只需要会用一些基础的就行,需要的时候随时去网上找就行了

1. 正则表达式简介

正则表达式是一种模式匹配工具,通过特定的语法和规则来描述字符串的结构。常见的正则表达式符号包括:

普通字符:

  • a-zA-Z0-9:匹配任意一个字母或数字字符。
  • a:匹配字符 ‘a’。
  • abc:匹配字符串 “abc”。

元字符:

  • .:匹配除换行符外的任何单个字符。
  • ^:匹配字符串的开始位置。
  • $:匹配字符串的结束位置。
  • *****:匹配前面的子表达式零次或多次。
  • +:匹配前面的子表达式一次或多次。
  • ?:匹配前面的子表达式零次或一次。
  • |:表示“或”操作符,匹配左边或右边的表达式。

转义字符

  • \:用于转义字符,使得元字符可以作为普通字符使用。例如, \\. 匹配字符 ‘.’。

字符类

  • [abc]:匹配方括号内的任意一个字符(a、b 或 c)。
  • [^abc]:匹配任何不在方括号内的字符。
  • [a-z]:匹配任何一个小写字母。
  • [A-Z]:匹配任何一个大写字母。
  • [0-9]:匹配任何一个数字。

预定义字符类

  • \d:匹配任何一个数字字符,相当于 [0-9]
  • \D:匹配任何一个非数字字符,相当于 [^0-9]
  • \w:匹配任何一个字母、数字或下划线字符,相当于 [a-zA-Z0-9_]
  • \W:匹配任何一个非字母、非数字、非下划线字符,相当于 [^a-zA-Z0-9_]
  • \s:匹配任何一个空白字符,包括空格、制表符、换页符等。
  • \S:匹配任何一个非空白字符。

边界匹配

  • \b:匹配一个单词边界,即字母与非字母之间的位置。
  • \B:匹配非单词边界的位置。

分组和捕获

  • ():用于分组和捕获子表达式。组可以记忆匹配的文本,稍后可以使用。
  • (?):用于分组但不捕获匹配的文本。

量词

  • {n}:匹配前面的子表达式恰好 n 次。
  • {n,}:匹配前面的子表达式至少 n 次。
  • {n,m}:匹配前面的子表达式至少 n 次,但不超过 m 次。

示例

  1. 匹配邮箱地址

    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    

    解释:

    • ^:匹配字符串的开始。
    • [a-zA-Z0-9._%+-]+:匹配一个或多个字母、数字、点、下划线、百分号、加号或减号。
    • @:匹配 ‘@’ 字符。
    • [a-zA-Z0-9.-]+:匹配一个或多个字母、数字、点或减号。
    • \.:匹配 ‘.’ 字符。
    • [a-zA-Z]{2,}:匹配至少两个字母。
    • $:匹配字符串的结束。
  2. 匹配电话号码(仅数字)

    ^\d{10}$
    

    解释:

    • ^:匹配字符串的开始。
    • \d{10}:匹配恰好10个数字。
    • $:匹配字符串的结束。
  3. 匹配日期(格式:YYYY-MM-DD)

    ^\d{4}-\d{2}-\d{2}$
    

    解释:

    • ^:匹配字符串的开始。
    • \d{4}:匹配四个数字(年)。
    • -:匹配 ‘-’ 字符。
    • \d{2}:匹配两个数字(月)。
    • -:匹配 ‘-’ 字符。
    • \d{2}:匹配两个数字(日)。
    • $:匹配字符串的结束。
  4. 匹配以特定字母开头的字符串

    ^[A-Ma-m]
    

    解释:

    • ^:匹配字符串的开始。
    • [A-Ma-m]:匹配大写字母 A 到 M 或小写字母 a 到 m。
2. MySQL中的正则表达式

在MySQL中,REGEXPRLIKE 是用于正则表达式匹配的关键字,二者功能相同,可以互换使用。

3. 正则表达式模糊查询

模糊查询用于查找符合特定模式的记录,这在搜索和过滤数据时非常有用。

3.1 查找以特定字母开头的用户名

假设我们想查找所有以’A’开头的用户名:

SELECT *
FROM users
WHERE name REGEXP '^A';

如果要查找以A到M字母开头的用户名,可以使用字符集:

SELECT *
FROM users
WHERE name REGEXP '^[A-M]';
3.2 查找包含特定字符的记录

我们可以查找用户名中包含数字的记录:

SELECT *
FROM users
WHERE name REGEXP '[0-9]';
4. 数据清洗

数据清洗是指对数据进行清理和格式化,使其符合预期的格式或标准。正则表达式在数据清洗中非常有效。

4.1 清理电话号码中的非数字字符

假设我们有一个 phone 字段,包含用户的电话号码,但可能包含一些非数字字符(如括号、空格或连字符)。我们可以使用正则表达式清理这些非数字字符:

UPDATE users
SET phone = REGEXP_REPLACE(phone, '[^0-9]', '');

上述查询将删除 phone 字段中的所有非数字字符,只保留数字。

4.2 替换不规范的字符串

假设我们有一个 address 字段,其中包含一些缩写,需要将其替换为全称。例如,将’Rd.‘替换为’Road’:

UPDATE users
SET address = REGEXP_REPLACE(address, 'Rd\\.', 'Road');
4.3 标准化数据格式

假设我们有一个日期字段 birthdate,其中的日期格式不统一。我们可以使用正则表达式将所有日期格式标准化为 YYYY-MM-DD

UPDATE users
SET birthdate = STR_TO_DATE(REGEXP_REPLACE(birthdate, '^(\\d{2})/(\\d{2})/(\\d{4})$', '\\3-\\1-\\2'), '%Y-%m-%d')
WHERE birthdate REGEXP '^(\\d{2})/(\\d{2})/(\\d{4})$';