mysql 字符串正則表達式及說明
概述
名稱 | 描述 |
---|---|
NOT REGEXP | 否定的REGEXP |
REGEXP | 字符串是否匹配正則表達式 |
RLIKE | 字符串是否匹配正則表達式 |
正則表達式是指定復(fù)雜搜索的模式的有力方式。本文討論可用于正則表達式匹配的操作符,并舉例說明可以用于正則表達式操作的一些特殊字符和構(gòu)造。
MySQL使用了Henry Spencer的正則表達式實現(xiàn),這是為了符合POSIX 1003.2。MySQL使用擴展版本支持SQL語句中的正則表達式模式匹配操作。
本文不包含 Henry Spencer’s regex(7)手冊頁中可以找到的所有細節(jié)。該手冊頁包含在MySQL源代碼發(fā)行版中,在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轉(zhuǎn)義語法(例如,\n代表換行符),所以您必須將您在REGEXP參數(shù)中使用的任何\都增加一倍。
正則表達式操作在決定字符類型和執(zhí)行比較時使用字符串表達式和模式參數(shù)的字符集和排序。如果參數(shù)具有不同的字符集或排序規(guī)則,則強制規(guī)則適用于第10.8.4節(jié)中所描述的“在表達式中進行排序的強制性”。如果任何一個參數(shù)都是二進制字符串,那么這些參數(shù)將以區(qū)分大小寫的方式作為二進制字符串處理。
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操作符以字節(jié)的方式工作,因此它們不是多字節(jié)安全的,并且可能會產(chǎn)生多字節(jié)字符集的意外結(jié)果。此外,這些運算符將字符的字節(jié)值和重音字符進行比較,即使給定的排序規(guī)則將它們視為相等,它們也可能不相等。
正則表達式語法
正則表達式描述一組字符串。最簡單的正則表達式是沒有特殊字符的表達式。例如,正則表達式hello匹配hello和其他內(nèi)容。
另一類正則表達式使用某些特殊結(jié)構(gòu),以便它們能夠匹配多個字符串。例如,正則表達式“hello|world“包含 |,匹配hello或world。
作為一個更復(fù)雜的例子,正則表達式B[an]*s匹配任何字符串Bananas、Baaaaas、Bs和任何以B開頭的字符串,以s結(jié)尾,中間包含任意數(shù)量的a或n字符。
REGEXP操作符的正則表達式可以使用下列任何特殊字符和構(gòu)造:
^
匹配字符串的開頭
mysql> SELECT 'fo\nfo' REGEXP '^fo$'; -> 0 mysql> SELECT 'fofo' REGEXP '^fo'; -> 1
$
匹配字符串結(jié)尾
mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1 mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 0
.
匹配任意字符(包括會車,換行)
mysql> SELECT 'fofo' REGEXP '^f.*$'; -> 1 mysql> SELECT 'fo\r\nfo' 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}
重復(fù);{n}和{m,n}表示法提供了一種更通用的方法來編寫正則表達式,該方法可以匹配模式的前一個原子(或“塊”)的多次出現(xiàn)。m和n是整數(shù)。
* 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)的范圍內(nèi)。
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]匹配任何十進制數(shù)字。要包含一個文字字符,它必須立即跟隨開頭的括號[。要包含一個文字字符,必須先寫或最后寫。任何沒有在[]對中定義特殊含義的字符只匹配它自己。
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這樣的字符名稱。
下表列出了允許的字符名稱。
下表顯示了允許的字符名稱和它們匹配的字符。對于以數(shù)字值表示的字符,值在八進制中表示。
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 '[[.~.]]'; -> 1 mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[=character_class=]
在一個括號表達式中(使用[和]),[=character_class=]表示一個等價類。它匹配所有具有相同排序值的字符,包括它自己。例如,如果o和(+)是等價類的成員,[[=o=]], [[=(+)=]], [o(+)]都是同義詞。等價類不能用作范圍的端點。
[:character_class:]
在一個括號表達式中(使用[和]),[:character_class:]表示一個字符類,它匹配屬于該類的所有字符。下表列出了標(biāo)準(zhǔn)類名。這些名稱代表在ctype(3)手冊頁中定義的字符類。一個特定的地區(qū)可能提供其他類名。字符類不能用作范圍的端點。
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:]]+'; -> 1 mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
[[:<:]], [[:>:]]
這些標(biāo)記代表單詞的邊界。它們分別匹配單詞的開頭和結(jié)尾。一個單詞是一個單詞字符序列,它不是在前面或后面跟著單詞字符。字字符是alnum類或下劃線(_)中的字母數(shù)字字符。
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
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL 參數(shù)相關(guān)概念及查詢更改方法
這篇文章主要介紹了MySQL 參數(shù)相關(guān)概念及查詢更改方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2020-09-09MySQL 服務(wù)器參數(shù)說明及查看 設(shè)置方法
MySQL 服務(wù)器參數(shù)說明及查看,設(shè)置方法,對于mysql不是很熟悉的朋友,可以參考下。2009-03-03MySQL 處理重復(fù)數(shù)據(jù)的方法(防止、刪除)
這篇文章主要介紹了MySQL 處理重復(fù)數(shù)據(jù)的方法,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07