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正则表达式操作在决定字符类型和执行比较时使用字符串表达式和模式参数的字符集和排序。如果参数具有不同的字符集或排序规则,则强制规则适用于第10.8.4节中所描述的“在表达式中进行排序的强制性”。如果任何一个参数都是二进制字符串,那么这些参数将以区分大小写的方式作为二进制字符串处理。
因为MySQL使用字符串中的C转义语法(例如,\n代表换行符),所以您必须将您在REGEXP参数中使用的任何\都增加一倍。
mysql> SELECT 'Michael!' REGEXP '.*'; +------------------------+| 'Michael!' REGEXP '.*' |+------------------------+|1 |+------------------------+mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; +---------------------------------------+| 'new*\n*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\nfo' REGEXP '^fo$'; -> 0mysql> SELECT 'fofo' REGEXP '^fo'; -> 1
$
mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 0
.
mysql> SELECT 'fofo' REGEXP '^f.*$'; -> 1mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; -> 1
a*
mysql> SELECT 'Ban' REGEXP '^Ba*n'; -> 1mysql> SELECT 'Baaan' REGEXP '^Ba*n'; -> 1mysql> SELECT 'Bn' REGEXP '^Ba*n'; -> 1
a+
mysql> SELECT 'Ban' REGEXP '^Ba+n'; -> 1mysql> SELECT 'Bn' REGEXP '^Ba+n'; -> 0
a?
mysql> SELECT 'Bn' REGEXP '^Ba?n'; -> 1mysql> SELECT 'Ban' REGEXP '^Ba?n'; -> 1mysql> SELECT 'Baan' REGEXP '^Ba?n'; -> 0
de|abc
mysql> SELECT 'pi' REGEXP 'pi|apa'; -> 1mysql> SELECT 'axe' REGEXP 'pi|apa'; -> 0mysql> SELECT 'apa' REGEXP 'pi|apa'; -> 1mysql> SELECT 'apa' REGEXP '^(pi|apa)$'; -> 1mysql> SELECT 'pi' REGEXP '^(pi|apa)$'; -> 1mysql> SELECT 'pix' REGEXP '^(pi|apa)$'; -> 0
(abc)*
mysql> SELECT 'pi' REGEXP '^(pi)*$'; -> 1mysql> SELECT 'pip' REGEXP '^(pi)*$'; -> 0mysql> SELECT 'pipi' REGEXP '^(pi)*$'; -> 1
{1}, {2,3}
* 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'; -> 0mysql> SELECT 'abcde' REGEXP 'a[bcd]{3}e'; -> 1mysql> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e'; -> 1
[a-dX], [^a-dX]
mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]'; -> 1mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$'; -> 0mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$'; -> 1mysql> SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$'; -> 0mysql> SELECT 'gheis' REGEXP '^[^a-dXYZ]+$'; -> 1mysql> SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$'; -> 0
[.characters.]
下表列出了允许的字符名称。
下表显示了允许的字符名称和它们匹配的字符。对于以数字值表示的字符,值在八进制中表示。
Name | Character | Name | Character |
---|---|---|---|
NUL | 0 | SOH | 001 |
STX | 002 | ETX | 003 |
EOT | 004 | ENQ | 005 |
ACK | 006 | BEL | 007 |
alert | 007 | BS | 010 |
backspace | ‘\b’ | HT | 011 |
tab | ‘\t’ | LF | 012 |
newline | ‘\n’ | VT | 013 |
vertical-tab | ‘\v’ | FF | 014 |
form-feed | ‘\f’ | CR | 015 |
carriage-return | ‘\r’ | SO | 016 |
SI | 017 | DLE | 020 |
DC1 | 021 | DC2 | 022 |
DC3 | 023 | DC4 | 024 |
NAK | 025 | SYN | 026 |
ETB | 027 | CAN | 030 |
EM | 031 | SUB | 032 |
ESC | 033 | IS4 | 034 |
FS | 034 | IS3 | 035 |
GS | 035 | IS2 | 036 |
RS | 036 | IS1 | 037 |
US | 037 | space | ’ ‘ |
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 | ‘~’ |
DEL | 177 |
mysql> SELECT '~' REGEXP '[[.~.]]'; -> 1mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[=character_class=]
[:character_class:]
Character Class Name | Meaning |
---|---|
alnum | Alphanumeric characters |
alpha | Alphabetic characters |
blank | Whitespace characters |
cntrl | Control characters |
digit | Digit characters |
graph | Graphic characters |
lower | Lowercase alphabetic characters |
Graphic or space characters | |
punct | Punctuation characters |
space | Space, tab, newline, and carriage return |
upper | Uppercase alphabetic characters |
xdigit | Hexadecimal digit characters |
Character Class Name | Meaning |
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
[[:<:]], [[:>:]]
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0
在正则表达式中使用一个特殊字符的文字实例,在它前面加上两个反斜杠()字符。MySQL解析器解释一个反斜杠,正则表达式库解释另一个。例如,要匹配包含特殊+字符的字符串1+2,只有以下正则表达式的最后一个是正确的:
mysql> SELECT '1+2' REGEXP '1+2'; -> 0mysql> SELECT '1+2' REGEXP '1\+2'; -> 0mysql> SELECT '1+2' REGEXP '1\\+2'; -> 1
参考文档:https://dev.mysql.com/doc/refman/5.7/en/regexp.html
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 原来MySQL|原来MySQL 数据类型也可以优化
- 表示数值的字符串
- JavaScript正则验证密码强弱度的实现方法
- 详解MySQL隔离级别
- 服务器安装系列|【最全最详细Docker】用docker部署mysql、tomcat、nginx、redis 环境部署
- 字符串|7行代码让B站崩溃3小时,竟因“一个诡计多端的0”
- python基础知识|【实现用户注册,登录和登出】但是用 Flask + MySQL(python)
- MySQL常用语法
- Centos7|Centos7 mysql5.7安装
- linux 安装mysql5.6