Mysql中Regexp常见用法

模糊匹配,包含特定字符串
# 查找content字段中包含“车友俱乐部”的记录

select * from club_content where content regexp '车友俱乐部'

# 此时的regexp与like的以下用法是等同的

select * from club_content where content like '%车友俱乐部%'

模糊匹配,以特定字符串开头
# 查找content字段中以“车友”开头的记录

select * from club_content where content regexp '^车友'

# 此时的regexp与like的以下用法是等同的

select * from club_content where content like '车友%'

模糊匹配,以特定字符串结尾
# 查找content字段中以“车友”结尾的记录

select * from club_content where content regexp '车友$'

# 此时的regexp与like的以下用法是等同的

select * from club_content where content like '%车友'

模糊匹配,或关系
# 查找content字段中包含“心得”、“分享”或“技术贴”

select * from club_content where content REGEXP '心得|分享|技术贴'

模糊匹配,不包含单个字符
# 查找content字段中不包含“车”字、“友”字的记录

select * from club_content where content REGEXP [^车友]

这个结果跑出来一看大吃一惊,竟然把所有记录给跑出来,这是为什么呢?
因为一旦加了这个方括号"[]",它就把里面的内容拆成单个的字符再匹配,它会逐个字符去匹配判断是不是等于“车”,或者是不是等于“友“,返回的结果是一组0、1的逻辑值。

如果想匹配不包含特定字符串,该怎么实现呢?

模糊匹配,不包含特定字符串
# 查找content字段不包含“车友”字符串的记录

select * from club_content where content not REGEXP '车友'

MySql REGEXP运算符匹配字符串

1 ^ 匹配以该字符后面的字符开头的字符串
举个例子: REGEXP ‘^x' 表示匹配以x开头的字符
2 $匹配以该字符前面的字符结尾的字符串
举个例子: REGEXP ‘y$' 表示匹配以y结尾的字符
3 .匹配任意一个字符
4 […]匹配在方括号中的任意一个字符。
如: [1-9] 匹配1到9的数字, [abc]匹配其中任意一个
5 *匹配零个或多个在它前面的字符
如: x* 匹配任何数量的x字符

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

这个问题有点怪 ,但很多时候我们会以字符串的形式存储数字 , 反过来我们用字符串进行数学运算时, 好像也不会出错 . 除非 , 用作数学运算的字符串不能转换成数字 .
但是我们改如何判断字符串是否能转换成数字呢 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 [...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 [^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 * 匹配前面的子表达式零次或多次。例如,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 )来加深我们的理解:

查找name字段中以'st'为开头的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

mysql正则REGEXP学习练习笔记

REGEXP在mysql是用来执行正则表达式的一个函数,像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。

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

如:

Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_",""];

但在一些特殊查询中,不用正则表达式是不行的。MYSQL提供的正则表达式WHERE谓词有三个,分别是:

REGEXP, RLIKE, NOT RLIKE

用这三个替换原有的LIKE谓词,后面即可以跟正则表达式。
例如要查询字段中含有“_”的数据,则要用以下查询语句:

SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

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

· ‘.'匹配任何单个的字符。
· 字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
· “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。
如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于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}$';

今天在应用中遇到了这样的一个问题,

有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2
需要从里面搜索出比如说:第一个逗号前的数字范围为3-5之间,第三个逗号前的数字的范围为3-5之间,第10个逗号前的数字范围为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+ 匹配1个或多个a字符的任何序列
a"hobby!=null and hobby!=''">
 concat(',',REPLACE (t.hobby, ' ', ''),',') regexp concat(',(',replace(#{hobby},',','|'),'),')
</if>
<!-- 表字段 t.hobby 取出值 -->
<if test="hobby!=null and hobby!=''">
 concat(',',REPLACE ('    吃,  喝,嫖,赌  , 抽,坑,蒙,拐,骗,偷 ', ' ', ''),',') regexp concat(',(',replace(#{hobby},',','|'),'),')
</if>
<!-- 表字段值处理后,去掉了多余的空格 -->
<if test="hobby!=null and hobby!=''">
 concat(',','吃,喝,嫖,赌,抽,坑,蒙,拐,骗,偷',',') regexp concat(',(',replace(#{hobby},',','|'),'),')
</if>
<!-- concat后得到一个字符串,首尾加上了逗号 -->
<if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,赌,抽,坑,蒙,拐,骗,偷,' regexp concat(',(',replace(#{hobby},',','|'),'),')
</if>
<!-- 取出参数 #{hobby} 的值 -->
<if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,赌,抽,坑,蒙,拐,骗,偷,' regexp concat(',(',replace('吃,喝,嫖,嫖',',','|'),'),')
</if>
<!-- 把逗号换成 |  -->
<if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,赌,抽,坑,蒙,拐,骗,偷,' regexp concat(',(','吃|喝|嫖|嫖','),')
</if>
<!-- concat后得到一个字符串,首尾加上了括号,逗号  -->
<if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,赌,抽,坑,蒙,拐,骗,偷,' regexp ',(吃|喝|嫖|嫖),' <!-- 纪念于谦老师不赌的美德 -->
</if>

得到结果是 1 作为条件就是真了。

复杂的过程主要是用来处理查寻条件。得到符合要求的正则作条件就ok了
但个人觉得,更理想的方式是:
被查寻字段在当初存入数据时就处理好格式:'吃,喝,嫖,赌,抽,坑,蒙,拐,骗,偷'
查寻条件可以处理好传进来:',(吃|喝|嫖|嫖),'
那么一个查寻就可以简化成这样

<if test="hobby!=null and hobby!=''">
 concat(',', t.hobby ,',') regexp #{hobby}
</if>

到这就差不多了,基本上就可以看得懂了,实在不行就参考下面的相关文章。

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。