mysql 怎么使用正则表达式

mysql 怎么使用正则表达式,第1张

属性名 regexp ‘匹配方式'

正则表达式的模式字符

^ 匹配字符开始的部分

eg1: 从info表name字段中查询以L开头的记录

select * from info where name regexp '^L'

eg2: 从info表name字段中查询以aaa开头的记录

select * from info where name regexp '^aaa'

$ 匹配字符结束的部分

eg1: 从info表name字段中查询以c结尾的记录

select * from info where name regexp 'c$'

eg2: 从info表name字段中查询以aaa结尾的记录

select * from info where name regexp 'aaa$'

. 匹配字符串中的任意一个字符,包括回车和换行

eg1: 从info表name字段中查询以L开头y结尾中间有两个任意字符的记录

select * from info where name regexp '^L..y$'

[字符集合]匹配字符集合中的任意字符

eg1: 从info表name字段中查询包含c、e、o三个字母中任意一个的记录

select * from info where name regexp '[ceo]'

eg2: 从info表name字段中查询包含数字的记录

select * from info where name regexp '[0-9]'

eg3: 从info表name字段中查询包含数字或a、b、c三个字母中任意一个的记录

select * from info where name regexp '[0-9a-c]'

[^字符集合]匹配除了字符集合外的任意字符

eg1: 从info表name字段中查询包含a-w字母和数字以外字符的记录

select * from info where name regexp '[^a-w0-9]'

s1|s2|s3 匹配s1s2s3中的任意一个

eg1: 从info表name字段中查询包含'ic'的记录

select * from info where name regexp 'ic'

eg2: 从info表name字段中查询包含ic、uc、ab三个字符串中任意一个的记录

select * from info where name regexp 'ic|uc|ab'

* 代表多个该字符前的字符,包括0个或1个

eg1: 从info表name字段中查询c之前出现过a的记录

select * from info where name regexp 'a*c'

+ 代表多个该字符前的字符,包括1个

eg1: 从info表name字段中查询c之前出现过a的记录

select * from info where name regexp 'a+c'(注意比较结果!)

字符串{N} 字符串出现N次

eg1: 从info表name字段中查询出现过a3次的记录

select * from info where name regexp 'a{3}'

字符串{M,N}字符串最少出现M次,最多出现N次

eg1: 从info表name字段中查询ab出现最少1次最多3次的记录

select * from info where name regexp 'ab{1,3}'

MYSQL中自带通配符(LIKE关键词)

%可以表示任意长度的字符(包括0)

-可以表示单个字符

昨天一个同事的程序的除了问题,怎么都调不通,一开始以为是hibernate的问题,后来发现问题是他在一个数据表里用了index作为字段名,但是index是mysql的关键字,呵呵,有点粗心啦. 查了一下,关键字(有的是保留字 )还真是不少.在MySQL中,下表中的字显式被保留。其中大多数字进制被标准SQL用作列名和/或表名(例如,GROUP)。少数被保留了,因为MySQL需要它们,保留字被引起来后可以用作识别符。出

ADDALLALTER

ANALYZEANDAS

ASCASENSITIVEBEFORE

BETWEENBIGINTBINARY

BLOBBOTHBY

CALLCASCADECASE

CHANGECHARCHARACTER

CHECKCOLLATECOLUMN

CONDITIONCONNECTIONCONSTRAINT

CONTINUECONVERTCREATE

CROSSCURRENT_DATECURRENT_TIME

CURRENT_TIMESTAMPCURRENT_USERCURSOR

DATABASEDATABASESDAY_HOUR

DAY_MICROSECONDDAY_MINUTEDAY_SECOND

DECDECIMALDECLARE

DEFAULTDELAYEDDELETE

DESCDESCRIBEDETERMINISTIC

DISTINCTDISTINCTROWDIV

DOUBLEDROPDUAL

EACHELSEELSEIF

ENCLOSEDESCAPEDEXISTS

EXITEXPLAINFALSE

FETCHFLOATFLOAT4

FLOAT8FORFORCE

FOREIGNFROMFULLTEXT

GOTOGRANTGROUP

HAVINGHIGH_PRIORITYHOUR_MICROSECOND

HOUR_MINUTEHOUR_SECONDIF

IGNOREININDEX

INFILEINNERINOUT

INSENSITIVEINSERTINT

INT1INT2INT3

INT4INT8INTEGER

INTERVALINTOIS

ITERATEJOINKEY

KEYSKILLLABEL

LEADINGLEAVELEFT

LIKELIMITLINEAR

LINESLOADLOCALTIME

LOCALTIMESTAMPLOCKLONG

LONGBLOBLONGTEXTLOOP

LOW_PRIORITYMATCHMEDIUMBLOB

MEDIUMINTMEDIUMTEXTMIDDLEINT

MINUTE_MICROSECONDMINUTE_SECONDMOD

MODIFIESNATURALNOT

NO_WRITE_TO_BINLOGNULLNUMERIC

ONOPTIMIZEOPTION

OPTIONALLYORORDER

OUTOUTEROUTFILE

PRECISIONPRIMARYPROCEDURE

PURGERAID0RANGE

READREADSREAL

REFERENCESREGEXPRELEASE

RENAMEREPEATREPLACE

REQUIRERESTRICTRETURN

REVOKERIGHTRLIKE

SCHEMASCHEMASSECOND_MICROSECOND

SELECTSENSITIVESEPARATOR

SETSHOWSMALLINT

SPATIALSPECIFICSQL

SQLEXCEPTIONSQLSTATESQLWARNING

SQL_BIG_RESULTSQL_CALC_FOUND_ROWSSQL_SMALL_RESULT

SSLSTARTINGSTRAIGHT_JOIN

TABLETERMINATEDTHEN

TINYBLOBTINYINTTINYTEXT

TOTRAILINGTRIGGER

TRUEUNDOUNION

UNIQUEUNLOCKUNSIGNED

UPDATEUSAGEUSE

USINGUTC_DATEUTC_TIME

UTC_TIMESTAMPVALUESVARBINARY

VARCHARVARCHARACTERVARYING

WHENWHEREWHILE

WITHWRITEX509

XORYEAR_MONTHZEROFILL

MySQL允许部分关键字用做未引起来的识别符,因为许多人以前曾使用过它们。下面列出了一些例子:

ACTION

BIT

DATE

ENUM

NO

TEXT

TIME

TIMESTAMP

正则表达式的作用是匹配文本,将一个模式与一个文本串进行比较,MySQL用WHERE子句对正则表达式提供初步的支持,允许指定正则表达式,过滤SELECT检索出来的数据,但是其实MySQL支持的只是正则表达式的一小部分;

通过实验的结果我发现LIKE是严格遵守整个列值进行匹配,而REGEXP只需要列值的部分包含表达式即可;通俗点讲就是,LIKE后面跟的字符位数和列值完全一致,但是REGEXP后跟的字符位数只需要小于或等于即可匹配;

默认情况下LIKE和REGEXP匹配是不区分大小写的,如果要区分大小写需要使用关键字BINARY;

[1-9]和[123456789]等价,字母也可以[a-z],也可以是非完整的比如[1-3][6-9]

正则表达式中出现过的特殊字符比如.[]|-等等,出现在所取值中,应该使用\进行转义显示;

有一些已经定义好的mysql内部,可以直接使用的类;

表9-2 字符类

类 说 明

[: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])

表9-3 重复元字符

控制匹配的字符出现次数

元 字 符 说 明

* 0个或多个匹配

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

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

{n} 指定数目的匹配

{n,} 不少于指定数目的匹配

{n,m} 匹配数目的范围(m不超过255)

前面使用的REGEXP都是匹配列的任意位置,如果只想匹配特殊位置,需要使用定位符;

定位元字符

元 字 符 说 明

^ 文本的开始

$ 文本的结尾

[[:<:]] 词的开始

[[:>:]] 词的结尾

前提是不选择库和表的时候,否则会报错;

如果结果为真则返回1,否则返回0;


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7485445.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存