Mysql中正则表达式Regexp常见用法

Mysql中正则表达式Regexp常见用法

本文主要介绍MySql中正则表达式REGEXP的常用用法,MySql REGEXP运算符匹配字符串,Mysql正则Regexp学习练习笔记,有需要的朋友可以参考一下。

Mysql中Regexp常见用法

模糊匹配,包含特定字符串

#在内容字段中查找带有“车友俱乐部”的记录

select * from Club _ content where content regexp 车友俱乐部

此时的# regexp相当于like的以下用法。

Select * from club _ content,其中类似“% riders club%”的内容

模糊匹配,从特定字符串开始

#在内容字段中查找以“Cheyou”开头的记录

select * from club _ content where content regexp riders

此时的# regexp相当于like的以下用法。

Select * from club _ content,其中“riders%”等内容

模糊匹配,以特定字符串结尾

#在内容字段中查找以“车友”结尾的记录

select * from club _ content where content regexp riders $

此时的# regexp相当于like的以下用法。

Select * from club _ content,其中类似“% riders”的内容

模糊匹配或关系

#搜索内容字段包含“体验”、“分享”或“技术文章”

select * from club _ content where content regexp experience | sharing | technical post

模糊匹配,不包含单个字符

#查找内容字段中不包含单词“汽车”或“朋友”的记录

select * from club _ content where content regexp[riders]

结果一脸惊讶的出来了,所有的记录都出来了。为什么?

因为这个方括号[]一旦加进去,就会把内容拆分成单个的字符,再进行匹配。它会逐个匹配字符,确定是等于“车”还是“朋友”。返回的结果是一组逻辑值0和1。

如果想匹配一个不包含特定字符串的字符串,怎么做呢?

模糊匹配,不包含特定字符串

#查找内容字段不包含字符串“Cheyou”的记录

Select * from club _ content,其中内容不是regexp riders

MySql REGEXP运算符匹配字符串

1匹配以该字符后的字符开头的字符串。

例如:REGEXP ^x表示匹配以x开头的字符

2 $匹配以该字符前面的字符结尾的字符串。

例如:regexp y $ 表示匹配以y结尾的字符。

3.匹配任何字符

4 […]匹配方括号中的任何字符。

例如,[1-9]匹配从1到9的数字,[abc]匹配其中的任何一个。

5 *匹配其前面的零个或多个字符

例如,x*匹配任意数量的x字符。

mysql 如何判断 "字符串" 是否为 "数字"

这个问题有点奇怪,但是很多时候我们是以字符串的形式存储数字的。另一方面,当我们使用字符串进行数学运算时,似乎不会出现错误。除非用于数学运算的字符串不能转换成数字。

但是如何判断一个字符串是否可以转换成数字呢?

使用mysql的REGEXP操作符。怎么用?

{String}正则表达式[^0-9.]

前面的字符串是我们要判断的,后面的字符串是mysql正则表达式,意思是匹配不是数字或者小数点的字符。

如果字符串包含0-9或小数点以外的数字,则返回true否则,它返回false。

例如:

选择( 123a 正则表达式[^0-9.]);-123a 包含字符 a ,输出结果为1。MySQL中的常量true输出1 false输出0。

注意:如果字符串中有空格,它也将匹配正则表达式,返回1。如果你想去掉两端的空格,你必须对判断后的字符串使用trim()函数。

这只是REGEXP操作符的一个简单应用。关于REGEXP的详细应用,请参考官方文档。

MySQL 正则表达式

在前一章中,我们已经了解到MySQL可以通过LIKE执行模糊匹配.%.

MySQL还支持其他正则表达式的匹配,在MySQL中使用REGEXP运算符来匹配正则表达式。

如果你懂PHP或者Perl的话,操作起来非常简单,因为MySQL的正则表达式匹配和这些脚本的相似。

下表中的常规模式可应用于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 | food’可以搭配‘z’或者‘food’。(z|f)ood”匹配“缩放”或“食物”。

*

零次或多次匹配前一个子表达式。比如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次。

例子

知道了上面的正则要求,我们就可以根据自己的要求,用正则表达式编写SQL语句了。下面我们就列举几个小例子(表名:person_tbl)来加深理解:

在名称字段中查找以“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 ^[aeiou]|ok$;

mysql正则REGEXP学习练习笔记

REGEXP是mysql中用来执行正则表达式的函数,比如php中的preg。regexp正则函数对于简单的查询只能使用like,复杂的还是需要使用regexp。让我们来看看。

MySql用户手册建议在构造简单查询时仍然应该使用通配符。

比如:

从[表名]中选择[* |字段名列表],其中[字段名]类似于[ % some letter | % some letter % , _ ,?some letter ];

但是,在一些特殊的查询中,使用正则表达式是不可能的。MYSQL提供了三个正则表达式WHERE谓词,即:

正则表达式,RLIKE,而不是RLIKE

用这三个替换原来的LIKE谓词,后面可以跟正则表达式。

例如,要查询字段中带有“_”的数据,请使用以下查询语句:

SELECT * FROM TABLENAME WHERE field name RLIKE 。[_].;

扩展正则表达式的一些字符是:

.匹配任何单个字符。

字符类"[.]"匹配方括号中的任何字符。例如,“[abc]”匹配“A”、“B”或“C”。要命名字符范围,请使用“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

*匹配其前面的零个或多个字符。例如,“x*”匹配任意数量的“x”字符,“[0-9]*”匹配任意数量的数字,以及”。* "匹配任意数量的任意字符。

如果REGEXP模式匹配测试值中的任何位置,则该模式匹配(这不同于LIKE模式匹配,LIKE模式匹配只匹配整个值)。

要定位一个模式,使其必须匹配被测值的开头或结尾,请在模式的开头使用" ",或在模式的结尾使用" $"。

要找出以“B”开头的名称,请使用“”来匹配名称的开头:

使用正则化

select * from pet where name regexp binary ^b;

SELECT * FROM pet WHERE name REGEXP fy $ ;

SELECT * FROM pet WHERE name REGEXP w ;

select * from pet where name regexp^….$;

select * from pet where name regexp ^.{5}$;

我今天在申请中遇到了这样一个问题,

有一个值为1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2的字段t1

你需要从内部搜索,比如:第一个逗号前的数字是3-5,第三个逗号前的数字是3-5,第十个逗号前的数字是3-5,其余的是1-5。

那么sql语句可以写成这样:

select * from TB where t1 regexp ^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%;

1.使用LIKE和NOT LIKE比较运算符(注意,不能使用=或!=);

2.默认情况下,该模式忽略大小写;

3.允许用“_”匹配任意单个字符,用“%”匹配任意多个字符(包括零个字符);

附一些mysql正则规则

匹配字符串的开头。

$匹配字符串的结尾。匹配任何字符(包括回车和换行符)

* A匹配0个或更多A字符的任意序列

匹配一个或多个A字符的任何序列

答?匹配0或1 a个字符

De|abc匹配序列De或abc

(abc)*匹配序列adc的0个或多个实例

{n}、{m,n} {n}或{m,n}符号提供了一种更通用的方法来编写正则表达式,它可以匹配模式的许多前述原子(或“部分”)。m和n都是整数。

* a可以写成{0,}

a可以写成{1,}

答?可以写成{0,1}

[a-dX]匹配a、b、c、d或X中的任何字符,其他两个字符之间的-字符形成一个范围。

[A-DX]匹配任何不是A、b、c、d或x的字符。前面的字符“”表示负数。

括号表达式中的[.characters.](使用[and]),匹配校对元素使用的字符序列,字符为单个字符或新行等字符名。

mysql SELECT ~ REGEXP [[。~.]];- 1

MySQL SELECT ~ REGEXP [[. tilde .]];- 1

[=character_class=]

在括号表达式中(使用[and]),[=character_class=]表示同类。它匹配具有相同校对值的所有字符,包括它本身,

[[=a=]]等价于[a( )],[a ],[a{1,}]

[:character_class:]

在括号表达式(使用[and])中,[:character_class:]表示与term class的所有字符匹配的字符类。

的标准类名是:

Alnum字母数字字符

字母字符

空白字符

控制字符

数字字符

图形字符

小写文本字符

图形打印空间字符

点的标点符号

空格、制表符、新行和回车

大写字母

xdighter十六进制数字字符

[[:]], [[:]]

这些标记代表单词边界。它们分别匹配单词的开头和结尾。单词是一系列单词字符,前后都没有单词字符。是alnum类中的字母数字字符或下划线(_)。

mysql select 方紫山 regexp [[:]]山[[:]];- 1

mysql select fang紫山 regexp [[:]]Fang[[:]];- 1

mysql select 房山子 regexp [[:]]山[[:]];- 0

正则表达式使用特殊字符,这些字符前面应该有两个反斜杠“”字符。

MySQL SELECT 1 2 REGEXP 1 2 ;- 0

MySQL SELECT 1 2 REGEXP 1 2 ;- 0

MySQL SELECT 1 2 REGEXP 1 2 ;- 1

MySQL 查寻条件使用正则 regexp

我用Mybatis。

T.hobby:条件字段

爱好:搜索参数,值可以是多个逗号分隔的值:“读书,交友,去”

!——t .爱好的价值一开始可能是这样的:‘吃喝嫖赌抽坑骗偷’。每个单词的两边都有不规则的空格-

!-以下是一步一步的演示-

if test=爱好!=null和爱好!=

concat(,,REPLACE (t.hobby, ,),,)regexp concat(,(,replace(#{hobby},,, | ),),)

/如果

!-表字段t.hobby取出值-

if test=爱好!=null和爱好!=

Concat(,,REPLACE(吃喝嫖赌抽骗骗偷,,,)regexp concat(,,replace (# {hobby},,,,

/如果

!-处理完表字段值后,多余的空格将被删除-

if test=爱好!=null和爱好!=

Concat(,,吃喝嫖赌抽骗骗偷,,)Regexp Concat(,,replace (# {Hobby},,,, | ),),

/如果

!-在concat后获取一个字符串,在开头和结尾使用逗号-

if test=爱好!=null和爱好!=

、吃、喝、操、赌、抽、骗、骗、偷、 regexp concat(、、replace (# {hobby}、、、 | )、)、)

/如果

!-取出参数#{hobby}的值-

if test=爱好!=null和爱好!=

,吃,喝,操,赌,抽,骗,骗,偷, regexp concat(,,replace(吃,喝,操,操,, | ),),)

/如果

!-将逗号改为|-

if test=爱好!=null和爱好!=

,吃,喝,操,赌,抽,骗,骗,偷, regexp concat(,,吃|喝|操|操,),)

/如果

!concat之后,得到一个字符串,开头和结尾都有括号,逗号-

if test=爱好!=null和爱好!=

,吃,喝,操,赌,抽,骗,骗,偷, regexp ,(吃|喝|操|操),!-为了纪念于谦不赌的美德-

/如果

结果为1作为条件是真的。

复杂流程主要用于处理搜索条件。得到符合要求的正规工作条件是可以的。

但就个人而言,更理想的方式是:

最初存储数据时,会处理搜索字段的格式:“吃、喝、干、赌、抽、骗、骗、偷”

搜索条件可以处理传入:,(吃|喝|操|操),

那么搜索可以简化如下

if test=爱好!=null和爱好!=

concat(,,t.hobby,,)regexp #{hobby}

/如果

大概就是这样。基本上可以理解。如果实在不行,可以参考下面的相关文章。

Mysql中正则表达式Regexp常见用法