MySQL系列(五): 正则表达式

导读:本篇文章讲解 MySQL系列(五): 正则表达式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

正则表达式


引言

今天博主将为大家分享一下MySql的正则表达式,不喜勿喷,如有异议欢迎讨论!

_ 我们都知道到MySQL可以通过 LIKE …% 来进行模糊匹配。_

MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

以下所写内容均与以前的文章有联系可以前往博文查看,陈永佳的博客


表达式

正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。

下表中的正则模式可应用于 REGEXP 操作符中


模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
p1 p2 p3 匹配 p1 或 p2 或 p3。例如,’z
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
基本字符匹配:

REGEXP关键字来匹配正则

SELECT name FROM tab1 WHERE name REGEXP ‘abc’; //REGEXP后所跟的东西作为正则表达式

  • ‘.’是以匹配任意一个字符
  • ‘a|b’可以匹配了两个a或者
  • ‘[abc]’可以匹配abc中的某一个字符
  • ‘[^a]’匹配除a以外的数据
  • ‘[1-9]’匹配1到9中的任何一个数字,[a-z]和[A-Z]同[1-9]
  • ”是相当于转义字符
  • SELECT name FROM tab1 WHERE name REGEXP ‘a|b’;
匹配字符类:
  • [:alnum:]  任意字母和数字(同[a-zA-Z0-9])
  • [:alpha:]  任意字符(同[a-zA-Z])
  • [:blank:]  空格和制表(同[\t])
  • [:cntrl:]  ASCII控制字符(ASCII 0到31和127)
  • [:digit:]  任意数字(同[0-9])
  • [:graph:]  与[:print:]相同,但不包括空格
  • [:lower:]  任意小写字母(同[a-z])
  • [:print:]  任意可打印字符
  • [:punct:]  既不在[:alnum:]又不在[:cntrl:]中的任意字符
  • [:space:]  包括空格在内的任意空白字符(同[\f\n\r\t\v])
  • [:upper:]  任意大写字母(同[A-Z])
  • [:xdigit:] 任意十六进制数字(同[a-fA-F0-9])
匹配多个字符:
 

0个或多个匹配

1个或多个匹配(等于{1,})

? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

将以上的字符放在你想匹配的字符的后面,即可匹配多个字符

eg:

SELECT 列名... FROM 表名 WHERE 列名 REGEXP 'a*'; 匹配0个和多个a
定位符:
  • ‘^’ 匹配文本的开始
  • ‘$’ 匹配文本的结尾
  • [[:<:]] 匹配词的开始
  • [[:>:]] 匹配词的结尾
匹配特殊字符使用\进行转义:
  • \.能够匹配.
  • \f换页
  • \n换行
  • \r回车
  • \t制表
  • \纵向制表
  • 注意:为了匹配\本身,需要使用\\
示例:

查询找到所有的名字以’st’开头

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st’;

查询找到所有的名字以’ok’结尾

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘ok$’;

查询找到所有的名字包函’mar’的字符串 mysql> SELECT name FROM person_tbl WHERE name
REGEXP ‘mar’;

查询找到所有名称以元音开始和’ok’结束 的 mysql> SELECT name FROM person_tbl WHERE name
REGEXP ‘1|ok$’;

一个正则表达式中的可以使用以下保留字

^

所匹配的字符串以后面的字符串开头

mysql> select “fonfo” REGEXP “^fo$”; -> 0(表示不匹配) mysql> select “fofo”
REGEXP “^fo”; -> 1(表示匹配)

$

所匹配的字符串以前面的字符串结尾 mysql> select “fono” REGEXP “^fono

&quot;

;

&gt;

1

m

y

s

q

l

&gt;

s

e

l

e

c

t

&quot;

f

o

n

o

&quot;

R

E

G

E

X

P

&quot;

f

o

&quot;; -&gt; 1(表示匹配) mysql&gt; select &quot;fono&quot; REGEXP &quot;^fo

;>1mysql>selectfonoREGEXPfo”; -> 0(表示不匹配)

.

匹配任何字符(包括新行) mysql> select “fofo” REGEXP “^f.“; -> 1(表示匹配) mysql>
select “fonfo” REGEXP “^f.
”; -> 1(表示匹配)

a*

匹配任意多个a(包括空串) mysql> select “Ban” REGEXP “^Ban”; -> 1(表示匹配) mysql>
select “Baaan” REGEXP “^Ba
n”; -> 1(表示匹配) mysql> select “Bn” REGEXP
“^Ba*n”; -> 1(表示匹配)

a+

匹配任意多个a(不包括空串) mysql> select “Ban” REGEXP “^Ba+n”; -> 1(表示匹配) mysql>
select “Bn” REGEXP “^Ba+n”; -> 0(表示不匹配)

a?

匹配一个或零个a mysql> select “Bn” REGEXP “^Ba?n”; -> 1(表示匹配) mysql> select
“Ban” REGEXP “^Ba?n”; -> 1(表示匹配) mysql> select “Baan” REGEXP “^Ba?n”;
-> 0(表示不匹配)

de|abc

匹配de或abc mysql> select “pi” REGEXP “pi|apa”; -> 1(表示匹配) mysql>
select “axe” REGEXP “pi|apa”; -> 0(表示不匹配) mysql> select “apa” REGEXP
“pi|apa”; -> 1(表示匹配) mysql> select “apa” REGEXP “^(pi|apa)

&quot;

;

&gt;

1

m

y

s

q

l

&gt;

s

e

l

e

c

t

&quot;

p

i

&quot;

R

E

G

E

X

P

&quot;

(

p

i

a

p

a

)

&quot;; -&gt; 1(表示匹配) mysql&gt; select &quot;pi&quot; REGEXP &quot;^(pi|apa)

;>1mysql>selectpiREGEXP(piapa)”; -> 1(表示匹配) mysql>
select “pix” REGEXP “^(pi|apa)$”; -> 0(表示不匹配)

(abc)*

匹配任意多个abc(包括空串) mysql> select “pi” REGEXP “^(pi)

&quot;

;

&gt;

1

m

y

s

q

l

&gt;

s

e

l

e

c

t

&quot;

p

i

p

&quot;

R

E

G

E

X

P

&quot;

(

p

i

)

&quot;; -&gt; 1(表示匹配) mysql&gt; select &quot;pip&quot; REGEXP &quot;^(pi)*

;>1mysql>selectpipREGEXP(pi)“; -> 0(表示不匹配) mysql> select “pipi”
REGEXP “^(pi)
$”; -> 1(表示匹配)

[a-dX]

匹配“a”、“b”、“c”、“d”或“X”

[^a-dX]

匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。

“[”、“]”必须成对使用 mysql> select “aXbc” REGEXP “[a-dXYZ]”; -> 1(表示匹配)
mysql> select “aXbc” REGEXP”2

&quot;

;

&gt;

0

m

y

s

q

l

&gt;

s

e

l

e

c

t

&quot;

a

X

b

c

&quot;

R

E

G

E

X

P

&quot;

[

a

d

X

Y

Z

]

+

&quot;; -&gt; 0(表示不匹配) mysql&gt; select &quot;aXbc&quot; REGEXP &quot;^[a-dXYZ]+

;>0mysql>selectaXbcREGEXP[adXYZ]+“; -> 1(表示匹配) mysql> select “aXbc” REGEXP
[a-dXYZ]+KaTeX parse error: Double superscript at position 48: …eis” REGEXP “^[^̲a-dXYZ]+”; -> 1(表示匹配) mysql> select “gheisa” REGEXP
[a-dXYZ]+$”; -> 0(表示不匹配)


最后

  • 更多参考精彩博文请看这里:陈永佳的博客

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


  1. aeiou ↩︎

  2. a-dXYZ ↩︎

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97898.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!