首页 > 数据库 > 数据库开发技术 > 《MySQL入门教程》第09篇 字符串模式匹配
expr LIKE pat
百分号(%)匹配零个或多个任意字符。
下划线(_)匹配一个任意字符。
select emp_name
from employee
where emp_name like '关%';
emp_name|
----------|
关兴 |
关平 |
关羽 |
select emp_name
from employee
where emp_name like '孙__';
emp_name|
----------|
孙丫鬟 |
孙尚香 |
expr LIKE pat ESCAPE 'escape_char'
select '完成进度:50% 已完成。' like '%50%%' as like1, '日期 20150101' like '%50%%' as like2;
like1|like2|
-----|-----|
1| 1|
select '完成进度:50% 已完成。' like '%50\%%' as like1, '日期 20150101' like '%50\%%' as like2;
like1|like2|
-----|-----|
1| 0|
select '2020_06_13' like '%06#_13%' escape '#' as like3;
like3|
-----|
1|
select 'Tony' like 'tony';
'Tony' like 'tony'|
------------------|
1|
select emp_name, email
from employee
where email not like '%a%';
emp_name|email |
----------|------------------|
刘备 |liubei@shuguo.com |
糜竺 |mizhu@shuguo.com |
邓芝 |dengzhi@shuguo.com|
REGEXP_LIKE(expr, pat[, match_type])
expr REGEXP pat
expr RLIKE pat
c:区分大小写;
i:不区分大小写,默认方式;
m:多行匹配,可以识别字符串内部的行终止符。默认情况下只在字符串的开始或结束匹配行终止符;
n:点号( . )匹配行终止符。默认情况下,点号遇到一行的结束时会终止匹配;
u:只匹配 Unix 行终止符,此时只有换行符被 .、^ 和 $ 看作一行的结束。
select regexp_like('Tony', 'tony') as regexp1, regexp_like('Tony', 'tony', 'c') as regexp2;
regexp1|regexp2|
-------|-------|
1| 0|
| 元字符 | 作用 | 示例 |
|---|---|---|
| ^ | 匹配字符串的开始 | SELECT REGEXP_LIKE(‘fo\nfo’, ‘^fo$’); -- 0 SELECT REGEXP_LIKE(‘fofo’, ‘^fo’); -- 1 |
| $ | 匹配字符串的结束 | SELECT REGEXP_LIKE(‘fo\no’, ‘^fo\no$’); -- 1 SELECT REGEXP_LIKE(‘fo\no’, ‘^fo$’); -- 0 |
| . | 匹配任意单个字符 | SELECT REGEXP_LIKE(‘fofo’, ‘^f.*$’); -- 1 SELECT REGEXP_LIKE(‘fo\r\nfo’, ‘^f.*$’); -- 0 SELECT REGEXP_LIKE(‘fo\r\nfo’, ‘^f.*$’, ‘m’); -- 1 SELECT REGEXP_LIKE(‘fo\r\nfo’, ‘(?m)^f.*$’); -- 1 |
| * | 匹配前面的字符零次或者多次 | SELECT REGEXP_LIKE(‘Baaan’, ‘^Ba*n’); -- 1 SELECT REGEXP_LIKE(‘Ban’, ‘^Ba*n’); -- 1 SELECT REGEXP_LIKE(‘Bn’, ‘^Ba*n’); -- 1 |
| + | 匹配前面的字符一次或者多次 | SELECT REGEXP_LIKE(‘Ban’, ‘^Ba+n’); -- 1 SELECT REGEXP_LIKE(‘Bn’, ‘^Ba+n’); -- 0 |
| ? | 匹配前面的字符零次或者一次 | SELECT REGEXP_LIKE(‘Bn’, ‘^Ba?n’); -- 1 SELECT REGEXP_LIKE(‘Ban’, ‘^Ba?n’); -- 1 SELECT REGEXP_LIKE(‘Baan’, ‘^Ba?n’); -- 0 |
| | | 匹配左边或者右边的模式 | SELECT REGEXP_LIKE(‘pi’, ‘pi|apa’); -- 1 SELECT REGEXP_LIKE(‘apa’, ‘pi|apa’); -- 1 SELECT REGEXP_LIKE(‘axe’, ‘pi|apa’); -- 0 |
| {n} | 匹配前面的字符 n 次 | SELECT REGEXP_LIKE(‘abcde’, ‘a[bcd]{3}e’); – 1 SELECT REGEXP_LIKE(‘abcde’, ‘a[bcd]{2}e’); – 0 |
| {m,n} | 匹配前面的字符 m 次到 n 次 | SELECT REGEXP_LIKE(‘abcde’, ‘a[bcd]{1,10}e’); -- 1 |
| […] | 匹配方括号内的任意单个字符,支持使用连字符号(-)指定一个范围 | SELECT REGEXP_LIKE(‘aXbc’, ‘[a-dXYZ]’); -- 1 |
| [^…] | 匹配不在方括号内的任意单个字符,支持使用连字符号(-)指定一个范围 | SELECT REGEXP_LIKE(‘gheis’, ‘[^a-dXYZ]+’); -- 1 |
| [:character_class:] | 匹配一个字符类,例如 [:alnum:] 可以匹配所有的字母和数字 | SELECT REGEXP_LIKE(‘justalnums’, ‘[[:alnum:]]+’); -- 1 SELECT REGEXP_LIKE(’!!’, ‘[[:alnum:]]+’); -- 0 |
以字母或者数字开头;
后面是一个或者多个字母、数组或特殊字符( . _ - );
然后是一个 @ 字符;
之后包含一个或者多个字母、数组或特殊字符( . - );
最后是域名,即 . 以及 2 到 4 个字母。
^[a-zA-Z0-9]+[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$
CREATE TABLE t_regexp (
email VARCHAR(50)
);
INSERT INTO t_regexp VALUES ('TEST@shuguo.com');
INSERT INTO t_regexp VALUES ('test@shuguo');
INSERT INTO t_regexp VALUES ('.123@shuguo.com');
INSERT INTO t_regexp VALUES ('test+email@shuguo.cn');
INSERT INTO t_regexp VALUES ('me.me@ shuguo.com');
INSERT INTO t_regexp VALUES ('123.test@shuguo-sanguo.org');
SELECT email
FROM t_regexp
WHERE REGEXP_LIKE(email, '^[a-zA-Z0-9]+[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$');
email |
--------------------------|
TEST@shuguo.com |
123.test@shuguo-sanguo.org|
原文作者:SQL编程思想;如有侵权,请联系管理员删除。