热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql 字符串正则表达式及说明【mysql特性】

这篇文章主要介绍了mysql 字符串正则表达式及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完

mysql 字符串正则表达式及说明

概述

名称描述
NOT REGEXP否定的REGEXP
REGEXP字符串是否匹配正则表达式
RLIKE字符串是否匹配正则表达式

正则表达式是指定复杂搜索的模式的有力方式。本文讨论可用于正则表达式匹配的操作符,并举例说明可以用于正则表达式操作的一些特殊字符和构造。

MySQL使用了Henry Spencer的正则表达式实现,这是为了符合POSIX 1003.2。MySQL使用扩展版本支持SQL语句中的正则表达式模式匹配操作。

本文不包含 Henry Spencer’s regex(7)手册页中可以找到的所有细节。该手册页包含在MySQL源代码发行版中,在regex中,在regex目录下的文件。

正则表达式运算符

expr NOT REGEXP pat, expr NOT RLIKE pat

这与NOT(expr REGEXP pat)相同。

expr REGEXP pat, expr RLIKE pat

如果字符串expr与模式pat指定的正则表达式匹配,则返回1。如果expr或pat为空,返回值为空。

RLIKE是REGEXP的同义词。

该模式可以是一个扩展的正则表达式,它的语法是在正则表达式语法中讨论的。模式不必是字符串。例如,可以将它指定为字符串表达式或表列。

Note

因为MySQL使用字符串中的C转义语法(例如, 代表换行符),所以您必须将您在REGEXP参数中使用的任何都增加一倍。

正则表达式操作在决定字符类型和执行比较时使用字符串表达式和模式参数的字符集和排序。如果参数具有不同的字符集或排序规则,则强制规则适用于第10.8.4节中所描述的“在表达式中进行排序的强制性”。如果任何一个参数都是二进制字符串,那么这些参数将以区分大小写的方式作为二进制字符串处理。

mysql> SELECT "Michael!" REGEXP ".*";
+------------------------+
| "Michael!" REGEXP ".*" |
+------------------------+
|                      1 |
+------------------------+
mysql> SELECT "new*
*line" REGEXP "new*.*line";
+---------------------------------------+
| "new*
*line" REGEXP "new*.*line" |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
mysql> SELECT "a" REGEXP "^[a-d]";
+---------------------+
| "a" REGEXP "^[a-d]" |
+---------------------+
|                   1 |
+---------------------+
mysql> SELECT "a" REGEXP "A", "a" REGEXP BINARY "A";
+----------------+-----------------------+
| "a" REGEXP "A" | "a" REGEXP BINARY "A" |
+----------------+-----------------------+
|              1 |                     0 |
+----------------+-----------------------+

警告

REGEXP和RLIKE操作符以字节的方式工作,因此它们不是多字节安全的,并且可能会产生多字节字符集的意外结果。此外,这些运算符将字符的字节值和重音字符进行比较,即使给定的排序规则将它们视为相等,它们也可能不相等。

正则表达式语法

正则表达式描述一组字符串。最简单的正则表达式是没有特殊字符的表达式。例如,正则表达式hello匹配hello和其他内容。

另一类正则表达式使用某些特殊结构,以便它们能够匹配多个字符串。例如,正则表达式“hello|world“包含 |,匹配hello或world。

作为一个更复杂的例子,正则表达式B[an]*s匹配任何字符串Bananas、Baaaaas、Bs和任何以B开头的字符串,以s结尾,中间包含任意数量的a或n字符。

REGEXP操作符的正则表达式可以使用下列任何特殊字符和构造:

  • ^

匹配字符串的开头

mysql> SELECT "fo
fo" REGEXP "^fo$";                   -> 0
mysql> SELECT "fofo" REGEXP "^fo";                      -> 1
  • $

匹配字符串结尾

mysql> SELECT "fo
o" REGEXP "^fo
o$";                 -> 1
mysql> SELECT "fo
o" REGEXP "^fo$";                    -> 0
  • .

匹配任意字符(包括会车,换行)

mysql> SELECT "fofo" REGEXP "^f.*$";                    -> 1
mysql> SELECT "fo
fo" REGEXP "^f.*$";                -> 1
  • a*

匹配任意一个或者多个字符

mysql> SELECT "Ban" REGEXP "^Ba*n";                     -> 1
mysql> SELECT "Baaan" REGEXP "^Ba*n";                   -> 1
mysql> SELECT "Bn" REGEXP "^Ba*n";                      -> 1
  • a+

匹配任意一个或者多个字符

mysql> SELECT "Ban" REGEXP "^Ba+n";                     -> 1
mysql> SELECT "Bn" REGEXP "^Ba+n";                      -> 0
  • a?

匹配0或1个字符。

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)$";                -> 1
mysql> SELECT "pi" REGEXP "^(pi|apa)$";                 -> 1
mysql> SELECT "pix" REGEXP "^(pi|apa)$";                -> 0
  • (abc)*

匹配0或多个序列abc的实例。

mysql> SELECT "pi" REGEXP "^(pi)*$";                    -> 1
mysql> SELECT "pip" REGEXP "^(pi)*$";                   -> 0
mysql> SELECT "pipi" REGEXP "^(pi)*$";                  -> 1
  • {1}, {2,3}

重复;{n}和{m,n}表示法提供了一种更通用的方法来编写正则表达式,该方法可以匹配模式的前一个原子(或“块”)的多次出现。m和n是整数。

* a* 
可以写成{0}。

* a+ 
可以写成{1}。

* a? 
可以写成{0,1}。

更确切地说,一个{n}恰好与n个实例匹配,一个{n,}匹配n个或多个实例,一个{m,n}匹配m到n个实例的a,包含。如果给定m和n, m必须小于等于n。

m和n必须在从0到RE_DUP_MAX(默认255)的范围内。

mysql> SELECT "abcde" REGEXP "a[bcd]{2}e";              -> 0
mysql> SELECT "abcde" REGEXP "a[bcd]{3}e";              -> 1
mysql> SELECT "abcde" REGEXP "a[bcd]{1,10}e";           -> 1
  • [a-dX], [^a-dX]

匹配任何字符(或者不是,如果使用^)要么是a,b,c,d或x字的另外两个人物之间形成一个范围从第一个字符匹配所有字符。例如,[0-9]匹配任何十进制数字。要包含一个文字字符,它必须立即跟随开头的括号[。要包含一个文字字符,必须先写或最后写。任何没有在[]对中定义特殊含义的字符只匹配它自己。

mysql> SELECT "aXbc" REGEXP "[a-dXYZ]";                 -> 1
mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]$";               -> 0
mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]+$";              -> 1
mysql> SELECT "aXbc" REGEXP "^[^a-dXYZ]+$";             -> 0
mysql> SELECT "gheis" REGEXP "^[^a-dXYZ]+$";            -> 1
mysql> SELECT "gheisa" REGEXP "^[^a-dXYZ]+$";           -> 0
  • [.characters.]

在一个括号表达式中(使用[和]),匹配该排序元素的字符序列。字符要么是单个字符,要么是像newline这样的字符名称。

下表列出了允许的字符名称。

下表显示了允许的字符名称和它们匹配的字符。对于以数字值表示的字符,值在八进制中表示。

NameCharacterNameCharacter
NUL0SOH001
STX002ETX003
EOT004ENQ005
ACK006BEL007
alert007BS010
backspace‘’HT011
tab‘ ’LF012
newline‘ ’VT013
vertical-tab‘v’FF014
form-feed‘f’CR015
carriage-return‘ ’SO016
SI017DLE020
DC1021DC2022
DC3023DC4024
NAK025SYN026
ETB027CAN030
EM031SUB032
ESC033IS4034
FS034IS3035
GS035IS2036
RS036IS1037
US037space’ ‘
exclamation-mark‘!’quotation-mark‘”’
number-sign‘#’dollar-sign‘$’
percent-sign‘%’ampersand‘&’
apostrophe‘”left-parenthesis‘(‘
right-parenthesis‘)’asterisk‘*’
plus-sign‘+’comma‘,’
hyphen‘-‘hyphen-minus‘-‘
period‘.’full-stop‘.’
slash‘/’solidus‘/’
zero‘0’one‘1’
two‘2’three‘3’
four‘4’five‘5’
six‘6’seven‘7’
eight‘8’nine‘9’
colon‘:’semicolon‘;’
less-than-sign‘<’equals-sign‘=’
greater-than-sign‘>’question-mark‘?’
commercial-at‘@’left-square-bracket‘[‘
backslash‘’reverse-solidus‘’
right-square-bracket‘]’circumflex‘^’
circumflex-accent‘^’underscore‘_’
low-line‘_’grave-accent‘`’
left-brace‘{‘left-curly-bracket‘{‘
vertical-line’ right-brace ‘}’ 
right-curly-bracket‘}’tilde‘~’
DEL177  
mysql> SELECT "~" REGEXP "[[.~.]]";                     -> 1
mysql> SELECT "~" REGEXP "[[.tilde.]]";                 -> 1
  • [=character_class=]

在一个括号表达式中(使用[和]),[=character_class=]表示一个等价类。它匹配所有具有相同排序值的字符,包括它自己。例如,如果o和(+)是等价类的成员,[[=o=]], [[=(+)=]], [o(+)]都是同义词。等价类不能用作范围的端点。

  • [:character_class:]

在一个括号表达式中(使用[和]),[:character_class:]表示一个字符类,它匹配属于该类的所有字符。下表列出了标准类名。这些名称代表在ctype(3)手册页中定义的字符类。一个特定的地区可能提供其他类名。字符类不能用作范围的端点。

Character Class NameMeaning
alnumAlphanumeric characters
alphaAlphabetic characters
blankWhitespace characters
cntrlControl characters
digitDigit characters
graphGraphic characters
lowerLowercase alphabetic characters
printGraphic or space characters
punctPunctuation characters
spaceSpace, tab, newline, and carriage return
upperUppercase alphabetic characters
xdigitHexadecimal digit characters
Character Class NameMeaning
mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+";       -> 1
mysql> SELECT "!!" REGEXP "[[:alnum:]]+";               -> 0
  • [[:<:]], [[:>:]]

这些标记代表单词的边界。它们分别匹配单词的开头和结尾。一个单词是一个单词字符序列,它不是在前面或后面跟着单词字符。字字符是alnum类或下划线(_)中的字母数字字符。

mysql> SELECT "a word a" REGEXP "[[:<:]]word[[:>:]]";   -> 1
mysql> SELECT "a xword a" REGEXP "[[:<:]]word[[:>:]]";  -> 0

在正则表达式中使用一个特殊字符的文字实例,在它前面加上两个反斜杠()字符。MySQL解析器解释一个反斜杠,正则表达式库解释另一个。例如,要匹配包含特殊+字符的字符串1+2,只有以下正则表达式的最后一个是正确的:

mysql> SELECT "1+2" REGEXP "1+2";                       -> 0
mysql> SELECT "1+2" REGEXP "1+2";                      -> 0
mysql> SELECT "1+2" REGEXP "1+2";                     -> 1

参考文档:https://dev.mysql.com/doc/refman/5.7/en/regexp.html

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程笔记。


推荐阅读
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
手机用户2502939543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有