MySQL - 正则表达式

你好,有抱负的数据库爱好者们!今天,我们将深入探索MySQL正则表达式的迷人世界。如果你之前从未编写过代码,不用担心 - 我们将从基础知识开始,逐步深入。在本教程结束时,你将能够像专业人士一样使用正则表达式!

MySQL - Regular Expressions

什么是正则表达式?

在我们深入了解MySQL的细节之前,让我们先了解一下正则表达式(regex)是什么。想象你正在文本的海洋中寻找一个特定的模式。这时,正则表达式就派上用场了!它就像一个超级搜索工具,能够找到字符串中的复杂模式。

MySQL正则表达式

在MySQL中,我们使用REGEXP操作符来处理正则表达式。它类似于LIKE操作符,但强大得多。

基本语法

以下是基本语法:

SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP 'pattern';

让我们看一些例子:

SELECT * FROM employees WHERE last_name REGEXP 'son';

这个查询将找到所有姓氏包含'son'的员工,比如Johnson、Wilson或Sonny。

大小写敏感

默认情况下,MySQL的正则表达式是不区分大小写的。如果你想要大小写敏感匹配,请使用BINARY关键字:

SELECT * FROM employees WHERE last_name REGEXP BINARY 'Smith';

这将匹配'Smith',但不会匹配'smith'或'SMITH'。

与REGEXP一起使用的模式

现在,让我们探索一些与REGEXP一起使用的常见模式。我喜欢将这些模式视为正则表达式的“秘密代码” - 一旦你知道它们,你几乎可以找到任何东西!

^ (脱字符) - 字符串开头

脱字符符号匹配字符串开头的模式。

SELECT * FROM products WHERE product_name REGEXP '^Apple';

这会找到所有产品名称以'Apple'开头的,比如'Apple iPhone'或'Apple MacBook'。

$ (美元符号) - 字符串结尾

美元符号匹配字符串结尾的模式。

SELECT * FROM products WHERE product_name REGEXP 'Pro$';

这会找到所有以'Pro'结尾的产品,比如'MacBook Pro'或'iPad Pro'。

. (点) - 任意单个字符

点匹配除换行符之外的任意单个字符。

SELECT * FROM words WHERE word REGEXP 'c.t';

这会匹配像'cat'、'cut'甚至'c@t'这样的单词!

* (星号) - 零个或多个出现

星号匹配前一个字符的零个或多个出现。

SELECT * FROM emails WHERE email REGEXP 'info.*@example.com';

这会匹配像'[email protected]'、'[email protected]'甚至'[email protected]'这样的电子邮件。

+ (加号) - 一个或多个出现

类似于*,但至少要求出现一次。

SELECT * FROM products WHERE product_name REGEXP 'iPad ?Pro+';

这会匹配'iPad Pro'、'iPad Pro'、'iPad Pro'等。

? (问号) - 零个或一个出现

问号使前一个字符变为可选。

SELECT * FROM words WHERE word REGEXP 'colou?r';

这会匹配'color'和'colour'。

[] (方括号) - 字符集

方括号定义了一个要匹配的字符集。

SELECT * FROM employees WHERE last_name REGEXP '[AEIOU]';

这会找到包含任何元音的姓氏。

[^] (否定字符集)

在方括号内添加一个脱字符来否定集合。

SELECT * FROM products WHERE product_name REGEXP '[^0-9]';

这会找到不包含任何数字的产品名称。

| (竖线) - 交替

竖线符号充当OR操作符。

SELECT * FROM animals WHERE species REGEXP 'cat|dog';

这会找到我们动物表中的所有猫和狗。

正则表达式函数和操作符

MySQL提供了几个用于处理正则表达式的函数和操作符。让我们来探索它们:

函数/操作符 描述
REGEXP 将字符串与正则表达式匹配
REGEXP_LIKE() 如果字符串匹配正则表达式模式,则返回1,否则返回0
REGEXP_INSTR() 返回第一个正则表达式匹配的起始索引
REGEXP_REPLACE() 替换匹配正则表达式的子字符串
REGEXP_SUBSTR() 返回匹配正则表达式的子字符串

让我们看一些例子:

REGEXP_LIKE()

SELECT * FROM products WHERE REGEXP_LIKE(product_name, '^iPhone');

这会找到所有产品名称以'iPhone'开头的。

REGEXP_INSTR()

SELECT email, REGEXP_INSTR(email, '@') AS at_position
FROM users;

这会返回每个电子邮件地址中'@'符号的位置。

REGEXP_REPLACE()

SELECT REGEXP_REPLACE('Hello, World!', '[aeiou]', '*') AS vowels_replaced;

这会替换所有元音为星号,返回'Hll, W*rld!'。

REGEXP_SUBSTR()

SELECT REGEXP_SUBSTR('[email protected]', '[^@]+') AS username;

这会提取电子邮件地址的用户名部分。

结论

恭喜你!你已经迈入了MySQL正则表达式的强大世界。记住,熟能生巧。尝试创建你自己的正则表达式模式,并尝试不同的组合。

在你继续你的旅程时,你会发现正则表达式就像是你数据库工具箱中的瑞士军刀。一开始可能看起来有点棘手,但一旦你掌握了它,你会想知道没有它你是怎么管理的!

快乐编码,愿你的查询总是返回你所期望的结果!

Credits: Image by storyset