MySQL正則表達(dá)式REGEXP使用詳解
正則表達(dá)式用來匹配文本的特殊的串(字符集合)(匹配文本,將一個(gè)模式(正則表達(dá)式)與一個(gè)文本串進(jìn)行比較)。
LIKE 和 REGEXP之間的重要差別
LIKE 匹配整個(gè)列,如果被匹配的文本在列值中出現(xiàn),LIKE 將不會(huì)找到它,相應(yīng)的行也不會(huì)被返回(除非使用通配符)。而 REGEXP 在列值內(nèi)進(jìn)行匹配,如果被匹配的文本在列值中出現(xiàn),REGEXP 將會(huì)找到它,相應(yīng)的行將被返回,并且 REGEXP 能匹配整個(gè)列值(與 LIKE 相同的作用)。
正則表達(dá)式匹配不區(qū)分大小寫
MySQL 的正則表達(dá)式匹配(自3.23.4版本后)不區(qū)分大小寫(即大寫和小寫都匹配)。為區(qū)分大小寫,可以使用 BINARY 關(guān)鍵字,例如:WHHERE name REGEXP BINARY 'Hern .000'。
簡(jiǎn)單的正則表達(dá)式測(cè)試
可以在不使用數(shù)據(jù)庫表的情況下用 SELECT 語句來測(cè)試正則表達(dá)式,REGEXP 檢查總是返回0(沒有匹配)或1(匹配)??梢杂脦淖执?REGEXP 來測(cè)試表達(dá)式,并試驗(yàn)它們。
例如:檢測(cè) 'Hern' 中是否含有數(shù)字
SELECT 'Hern' REGEXP '[0-9]';
結(jié)果將返回0(因?yàn)?‘Hern’ 中沒有數(shù)字)
空白元字符(特殊含義的字符)
用雙反斜杠(\\)來引用元字符(具有特殊含義的字符)。常用引用元字符:
字符 | 其它信息 |
---|---|
[ 和 ] | 左右方括號(hào)用于指定字符類。字符類是進(jìn)行匹配時(shí)所要依據(jù)的一組字符。 除連字符 (-) 和脫字符 (^) 外,在字符類中指定的元字符和量詞(如 * 和 {m},分別為元字符和量詞)沒有特殊意義,可當(dāng)作實(shí)際字符進(jìn)行運(yùn)算。 |
* | 星號(hào)可用于與字符匹配 0 次或多次。例如,REGEXP '.*abc' 匹配的字符串以 abc 結(jié)尾并以任何前綴開頭。因此,aabc、xyzabc 和 abc 匹配,但 bc 和 abcc 則不匹配。 |
? | 問號(hào)可用于與字符匹配 0 次或 1 次。例如,'colou?r' 匹配 color 和 colour。 |
+ | 加號(hào)可用于與字符匹配 1 次或多次。例如,'bre+' 匹配 bre 和 bree,但不匹配 br。 |
- | 可以在字符類中使用一個(gè)連字符來表示一個(gè)范圍。例如, |
% | 百分號(hào)可與 SIMILAR TO 配合使用來匹配任意數(shù)目的字符。 不將百分號(hào)視為 REGEXP 和 REGEXP_SUBSTR 所使用的元字符。當(dāng)指定時(shí),它匹配百分號(hào) (%)。 |
_(下劃線字符) | 可將下劃線與 SIMILAR TO 配合使用來匹配單個(gè)字符。 不將下劃線視為 REGEXP 和 REGEXP_SUBSTR 所使用的元字符。當(dāng)指定時(shí),它匹配下劃線 (_)。 |
| | 管道符號(hào)用于指定匹配字符串時(shí)要使用的替代模式。在由豎線分隔的一行模式中,豎線被解釋為 OR,匹配過程從最左側(cè)的模式開始,在找到第一個(gè)匹配項(xiàng)時(shí)停止。因此,您應(yīng)按優(yōu)先級(jí)的降序順序列出模式。您可以指定任意數(shù)量的替代模式。 |
( 和 ) | 當(dāng)左括號(hào)和右括號(hào)用于正則表達(dá)式的各個(gè)組合部分時(shí),它們?yōu)樵址@纾?code>(ab)* 匹配零個(gè)或多個(gè) ab 的重復(fù)項(xiàng)。與使用數(shù)學(xué)表達(dá)式一樣,您使用組合來控制正則表達(dá)式各部分的計(jì)算順序。 |
{ 和 } | 當(dāng)左大括號(hào)和右大括號(hào)用于指定量詞時(shí),它們?yōu)樵址A吭~指定一個(gè)模式要構(gòu)成某個(gè)匹配所必須重復(fù)的次數(shù)。例如:
|
\ | 反斜線被用作元字符的轉(zhuǎn)義字符。它也可被用于轉(zhuǎn)義非元字符。 |
^ | 匹配輸入字符串的開始位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
$ | 匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對(duì)象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
. | 匹配除 "\n" 之外的任何單個(gè)字符。要匹配包括 '\n' 在內(nèi)的任何字符,請(qǐng)使用象 '[.\n]' 的模式。 |
: | 在字符集中使用冒號(hào)來指定子字符類。例如, |
注意:
1、多數(shù)正則表達(dá)式實(shí)現(xiàn)使用單個(gè)反斜杠轉(zhuǎn)義特殊字符,一遍能使用這些字符本身,但是MySQL要求兩個(gè)反斜杠(MySQL自己解釋一個(gè),正則表達(dá)式庫解釋另一個(gè))。
2、^ 符號(hào)的雙重用途: ^在集合中(用 [ ] 定義)時(shí)用它來否定該集合,否則用來指定串的開始處。
匹配字符類
子字符類 | 其它信息 |
---|---|
[:alpha:] | 匹配當(dāng)前歸類中的大寫和小寫字母字符。例如,'[0-9]{3}[[:alpha:]]{2}' 匹配三個(gè)數(shù)字,后跟兩個(gè)字母。 |
[:alnum:] | 匹配當(dāng)前歸類中的數(shù)字、大寫和小寫字母字符。例如,'[[:alnum:]]+' 匹配含有一個(gè)或多個(gè)字母和數(shù)字的字符串。 |
[:digit:] | 匹配當(dāng)前歸類中的數(shù)字。例如,'[[:digit:]-]+' 匹配含有一個(gè)或多個(gè)數(shù)字或橫線的字符串。同樣,'[^[:digit:]-]+' 匹配含有一個(gè)或多個(gè)不是數(shù)字或橫線的字符的字符串。 |
[:lower:] | 匹配當(dāng)前歸類中的小寫字母字符。例如,'[[:lower:]]' 不匹配 A,因?yàn)?A 為大寫。 |
[:space:] | 匹配單個(gè)空格 (' ')。例如,搜索 Contacts.City 以查找任何名稱為兩個(gè)詞的城市: SELECT City FROM Contacts WHERE City REGEXP '.*[[:space:]].*'; |
[:upper:] | 匹配當(dāng)前歸類中的大寫字母字符。例如, |
[:whitespace:] | 匹配一個(gè)空白字符,例如,空格、制表符、換頁符和回車符。 |
[:ascii:] | 匹配任何七位的 ASCII 字符(0 到 127 之間的順序值)。 |
[:blank:] | 匹配一個(gè)空白區(qū)或水平制表符。
|
[:cntrl:] | 匹配順序值小于 32 或字符值為 127 的 ASCII 字符(控制字符)。控制字符包括換行符、換頁符、退格符,等等。 |
[:graph:] | 匹配打印字符。
|
[:print:] | 匹配打印字符和空格。
|
[:punct:] | 匹配其中一個(gè)字符: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
|
[:word:] | 匹配當(dāng)前歸類中的字母、數(shù)字或下劃線字符。
|
[:xdigit:] | 匹配字符類 [0-9A-Fa-f] 中的字符。 |
正則表達(dá)式支持的其它語法約定
正則表達(dá)式語法 | 名稱和含義 |
---|---|
\0xxx | 匹配值為 \0xxx 的字符,其中 xxx 是任何八進(jìn)制數(shù)字序列,0 是零。例如, |
\a | 匹配報(bào)警字符。 |
\A | 用在字符集外部以便匹配字符串的開頭。 等效于在字符集外部使用的 |
\b | 匹配退格字符。 |
\B | 匹配反斜線字符 (\)。 |
\cX | 匹配已命名的控制字符。例如,\cZ 代表 ctrl-Z。 |
\d | 匹配當(dāng)前歸類中的一個(gè)數(shù)字。例如,以下語句搜索 Contacts.Phone 以查找以 00 結(jié)尾的所有電話號(hào)碼: SELECT Surname, Surname, City, Phone FROM Contacts WHERE Phone REGEXP '\\d{8}00'; \d 既可用在字符類的內(nèi)部也可用在字符類的外部,等效于 |
\D | 匹配數(shù)字以外的任何字符。它的作用與 \d 正好相反。 \D 既可用在字符類的內(nèi)部也可用在字符類的外部,等效于 在方括號(hào)內(nèi)使用取非速記時(shí)請(qǐng)務(wù)必謹(jǐn)慎。 |
\e | 匹配轉(zhuǎn)義字符。 |
\E | 將由 \Q 啟動(dòng)的將元字符視為非元字符這一功能停止。 |
\f | 匹配換頁符。 |
\n | 匹配換行符。 |
\Q | 將所有元字符視為非元字符,直到遇到 \E。例如, |
\r | 匹配回車符。 |
\s | 匹配一個(gè)被視為白空格的空格或字符。例如,從 Products.ProductName 中返回名稱中至少有一個(gè)空格的所有產(chǎn)品名: SELECT Name FROM Products WHERE Name REGEXP '.*\\s.*'; \s 既可用在字符類的內(nèi)部也可用在字符類的外部,等效于 |
\S | 匹配非白空格字符。它的作用與 \d 正好相反,而等效于 \S 既可用在字符類的內(nèi)部也可用在字符類的外部。 在方括號(hào)內(nèi)使用取非速記時(shí)請(qǐng)務(wù)必謹(jǐn)慎。 |
\t | 匹配水平制表符。 |
\v | 匹配垂直制表符。 |
\w | 匹配當(dāng)前歸類中的字母字符、數(shù)字或下劃線。例如,從 Contacts.Surname 返回長(zhǎng)度正好為七個(gè)字母數(shù)字字符的所有姓: SELECT Surname FROM Contacts WHERE Surname REGEXP '\\w{7}'; \w 既可用在字符類的內(nèi)部也可用在字符類的外部。等效于 |
\W | 匹配當(dāng)前歸類中字母字符、數(shù)字或下劃線以外的任何字符。它的作用與 \w 正好相反,而等效于 在字符類的內(nèi)部和外部都可使用此正則表達(dá)式。 |
\xhh | 匹配值為 0xhh 的字符,其中 hh 最多為兩個(gè)十六進(jìn)制數(shù)字。例如, |
\x{hhh} | 匹配值為 0xhhh 的字符,其中 hhh 最多為三個(gè)十六進(jìn)制數(shù)字。 |
\z 和 \Z | 匹配字符串結(jié)尾處的位置(而非字符)。等效于 |
正則表達(dá)式斷言
斷言測(cè)試條件是否為真,并影響字符串中開始匹配的位置。斷言不返回字符;最終匹配中不包括斷言模式。REGEXP 搜索條件和REGEXP_SUBSTR 函數(shù)支持?jǐn)嘌阅J健?/p>
在嘗試拆分字符串時(shí),lookahead 和 lookbehind 斷言對(duì)于 REGEXP_SUBSTR 將非常有用。例如,可以通過執(zhí)行以下語句返回 Customers 表的 Address 列中街道名稱(不帶街道編號(hào))的列表:
SELECT REGEXP_SUBSTR( Street, '(?<=^\\S+\\s+).*$' ) FROM Customers;
另一個(gè)示例:假定您想要使用正則表達(dá)式來驗(yàn)證口令是否符合某些規(guī)則??梢允褂妙愃朴谙旅鎯?nèi)容的零寬度斷言:
IF password REGEXP '(?=.*[[:digit:]])(?=.*[[:alpha:]].*[[:alpha:]])[[:word:]]{4,12}' MESSAGE 'Password conforms' TO CLIENT; ELSE MESSAGE 'Password does not conform' TO CLIENT; END IF
password 至少有一位數(shù)(零寬度肯定斷言 [[:digit:]])當(dāng)滿足以下條件時(shí),口令有效:
- password 至少有兩個(gè)字母字符(零寬度肯定斷言 [[:alpha:]].*[[:alpha:]])
- password 只含有字母數(shù)字字符或下劃線字符 ([[:word:]])
- password 最少含有 4 個(gè)字符,最多含有 12 個(gè)字符 ({4,12})
下表包含 SQL Anywhere 支持的斷言:
語法 | 含義 |
---|---|
(?=pattern) | 肯定的 lookahead 零寬度斷言 查看字符串中的當(dāng)前位置是否緊跟著出現(xiàn)了 pattern,而 pattern 不會(huì)成為匹配字符串的一部分。 例如, |
(?!pattern) | 否定的 lookahead 零寬度斷言 查看字符串中的當(dāng)前位置是否沒有 緊跟著出現(xiàn) pattern,而 pattern 不會(huì)成為匹配字符串的一部分。所以, 例如, |
(?<=pattern) | 肯定的 lookbehind 零寬度斷言 查看字符串中的當(dāng)前位置是否前面緊挨著出現(xiàn)了 pattern,而 pattern 不會(huì)成為匹配字符串的一部分。所以, 例如, |
(?<!pattern) | 否定的 lookbehind 零寬度斷言 查看字符串中的當(dāng)前位置的前面是否沒有 緊挨著出現(xiàn) pattern,而 pattern 不會(huì)成為匹配字符串的一部分。 例如, |
(?>pattern) | 所屬關(guān)系局部子表達(dá)式 僅匹配與 pattern 匹配的剩余字符串的最大前綴。 例如,在 |
(?:pattern) | 非捕獲塊 該語法在功能上就等效于 pattern,是為實(shí)現(xiàn)兼容性而提供。 例如,在 同樣, |
(?#text) | 用于注釋。text 的內(nèi)容會(huì)被忽略。 |
語法實(shí)例
1、基本字符匹配
例如搜索city表中 Population 列包含'1000'的所有信息,并按照 ID 升序排序。
SELECT * FROM city WHERE Population REGEXP '1000' ORDER BY ID;
搜索city表中 Population 列包含'000'的所有信息,并按照 ID 升序排序。
SELECT * FROM city WHERE Population REGEXP '.000' ORDER BY ID;
注意:這里的點(diǎn)(.)表示匹配任意一個(gè)字符,例如,1000,2000,3000等都匹配且返回。
2、進(jìn)行 OR (使用豎線(|)符號(hào)表示)匹配(為搜索多個(gè)串之一)
例如搜索city表中 Population 列包含 '1000' 或 '2000' 的所有信息,并按照ID升序排序。
SELECT * FROM city WHERE Population REGEXP '1000|2000' ORDER BY ID;
注意:多個(gè) OR 條件可以并入單個(gè)正則表達(dá)式,例如 '1000|2000|3000' 將匹配1000或2000或3000.
3、匹配幾個(gè)字符之一(匹配任何單一字符,使用符號(hào)中括號(hào)([ ]))
例如搜索city表中 Population 列包含 '1000' 或 '2000' 或 '3000'的所有信息,并按照ID升序排序。
SELECT * FROM city WHERE Population REGEXP '[123]000' ORDER BY ID;
注意:[ ] 是另一種形式的 OR 語句,事實(shí)上,[123]000 為 [1|2|3]000 的縮寫(與 '1000|2000|3000'要一個(gè)意思)。
例如搜索city表中 Population 列除 '1000' 或 '2000' 或 '3000'以外的所有信息,并按照ID升序排序。
SELECT * FROM city WHERE Population REGEXP '[^123]000' ORDER BY ID;
注意:使用 ^ 符號(hào)匹配除中括號(hào)([ ])之外的任意值,并返回。
4、匹配范圍(使用 - 符號(hào))
例如搜索city表中 Population 列 '1000' - '5000'的所有信息,并按照ID升序排序。
SELECT * FROM city WHERE Population REGEXP '[1-5]000' ORDER BY ID; 或 SELECT * FROM city WHERE Population REGEXP '[12345]000' ORDER BY ID;
5、匹配特殊字符(使用 \\ 符號(hào))
例如搜索city表中 name 列中包含 ' . ' 字符值的所有信息。
SELECT * FROM city WHERE name REGEXP '\\.';
6、匹配多個(gè)實(shí)例
(1)、例如搜索city表中name列含有()、數(shù)字0~9、‘Hern’的所有信息
SELECT * FROM city WHERE name REGEXP '\\([0-9] Hern?\\)';
注意:?jiǎn)柼?hào)(?)匹配‘Hern’后面出現(xiàn)任何字符的0次或1次。
(2)、例如搜索city表中name列含有連在一起的4位數(shù)字的所有信息
SELECT * FROM city WHERE name REGEXP '[[:digit:]]{4}'; 或者 SELECT * FROM city WHERE name REGEXP '[0-9][0-9][0-9][0-9]';
7、定位符
例如搜索city表中name列開始位置含有連在一起的4位數(shù)字的所有信息
SELECT * FROM city WHERE name REGEXP '^[0-9]{4}';
總結(jié)
到此這篇關(guān)于MySQL正則表達(dá)式REGEXP使用的文章就介紹到這了,更多相關(guān)MySQL正則表達(dá)式REGEXP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux系統(tǒng)ubuntu18.04安裝mysql 5.7
這篇文章主要為大家詳細(xì)介紹了linux系統(tǒng)ubuntu18.04安裝mysql 5.7,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09最新Navicat?15?for?MySQL破解+教程?正確破解步驟
Navicat?for?MySQL是一個(gè)針對(duì)MySQL數(shù)據(jù)庫而開發(fā)的第三方mysql管理工具,該軟件可以用于?MySQL?數(shù)據(jù)庫服務(wù)器版本?3.21?或以上的和?MariaDB?5.1?或以上,這篇文章主要介紹了最新Navicat?15?for?MySQL破解+教程?正確破解步驟,需要的朋友可以參考下2023-04-04mybatis+mysql 使用存儲(chǔ)過程生成流水號(hào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis+mysql 使用存儲(chǔ)過程生成流水號(hào)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-01-01

mybatis實(shí)戰(zhàn)之?dāng)r截器解讀

mysql正確刪除數(shù)據(jù)的方法(drop,delete,truncate)

pymysql.err.DataError:(1264, ")異常的有效解決方法(最新推薦)

MySQL 字符串拆分實(shí)例(無分隔符的字符串截取)