本文主要介绍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}
/如果
大概就是这样。基本上可以理解。如果实在不行,可以参考下面的相关文章。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。