第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁(yè) 慕課教程 MySQL 入門教程 MySQL 入門教程 31 MySQL 中使用正則表達(dá)式

MySQL 中使用正則表達(dá)式

前面小節(jié)介紹過(guò)使用 LIKE 模糊查詢包含指定內(nèi)容的字段的結(jié)果集,本小節(jié)介紹正則表達(dá)式相關(guān)的基礎(chǔ)知識(shí),學(xué)習(xí)之后,可以使用正則表達(dá)式來(lái)查詢更加符合需求的字段內(nèi)容。

1. 正則表達(dá)式中的元字符

元字符 描述
\ 將下一個(gè)字符標(biāo)記符、或一個(gè)向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,“\n”匹配\n?!癨n”匹配換行符。序列“\”匹配“\”而“(”則匹配“(”。即相當(dāng)于多種編程語(yǔ)言中都有的“轉(zhuǎn)義字符”的概念。
^ 匹配輸入字行首。如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。
$ 匹配輸入行尾。如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表達(dá)式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等價(jià)于{0,}。
+ 匹配前面的子表達(dá)式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}。
? 匹配前面的子表達(dá)式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。?等價(jià)于{0,1}。
{n} n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個(gè)o。
{n,} n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o?!皁{1,}”等價(jià)于“o+”。“o{0,}”則等價(jià)于“o*”。
{n,m} m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個(gè)o為一組,后三個(gè)o為一組?!皁{0,1}”等價(jià)于“o?”。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
? 當(dāng)該字符緊跟在任何一個(gè)其他限制符(*,+,?,{n},{n,},{n,m})后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少地匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多地匹配所搜索的字符串。例如,對(duì)于字符串“oooo”,“o+”將盡可能多地匹配“o”,得到結(jié)果[“oooo”],而“o+?”將盡可能少地匹配“o”,得到結(jié)果 [‘o’, ‘o’, ‘o’, ‘o’]
. 匹配除“\n”和"\r"之外的任何單個(gè)字符。要匹配包括“\n”和"\r"在內(nèi)的任何字符,請(qǐng)使用像“[\s\S]”的模式。
(pattern) 匹配pattern并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號(hào)字符,請(qǐng)使用“\(”或“\)”。
(?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲(chǔ)供以后使用。這在使用或字符來(lái)組合一個(gè)模式的各個(gè)部分時(shí)很有用。
(?=pattern) 非獲取匹配,正向肯定預(yù)查,在任何匹配pattern的字符串開(kāi)始處匹配查找字符串,該匹配不需要獲取供以后使用。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始。
(?!pattern) 非獲取匹配,正向否定預(yù)查,在任何不匹配pattern的字符串開(kāi)始處匹配查找字符串,該匹配不需要獲取供以后使用。例如“Windows(?!95
(?<=pattern) 非獲取匹配,反向肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。*python的正則表達(dá)式?jīng)]有完全按照正則表達(dá)式規(guī)范實(shí)現(xiàn),所以一些高級(jí)特性建議使用其他語(yǔ)言如java、scala等
(?<!patte_n) 非獲取匹配,反向否定預(yù)查,與正向否定預(yù)查類似,只是方向相反。*python的正則表達(dá)式?jīng)]有完全按照正則表達(dá)式規(guī)范實(shí)現(xiàn),所以一些高級(jí)特性建議使用其他語(yǔ)言如java、scala等
[xyz] 字符集合。匹配所包含的任意一個(gè)字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 負(fù)值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。
[a-z] 字符范圍。匹配指定范圍內(nèi)的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫字母字符。注意:只有連字符在字符組內(nèi)部時(shí),并且出現(xiàn)在兩個(gè)字符之間時(shí),才能表示字符的范圍; 如果出字符組的開(kāi)頭,則只能表示連字符本身.
[^a-z] 負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內(nèi)的任意字符。
\b 匹配一個(gè)單詞的邊界,也就是指單詞和空格間的位置(即正則表達(dá)式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。
\B 匹配非單詞邊界?!癳r\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一個(gè)Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個(gè)原義的“c”字符。
\d 匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]。grep 要加上-P,perl正則支持
\D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]。grep要加上-P,perl正則支持
\f 匹配一個(gè)換頁(yè)符。等價(jià)于\x0c和\cL。
\n 匹配一個(gè)換行符。等價(jià)于\x0a和\cJ。
\r 匹配一個(gè)回車符。等價(jià)于\x0d和\cM。
\s 匹配任何不可見(jiàn)字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于[ \f\n\r\t\v]。
\S 匹配任何可見(jiàn)字符。等價(jià)于[^ \f\n\r\t\v]。
\t 匹配一個(gè)制表符。等價(jià)于\x09和\cI。
\v 匹配一個(gè)垂直制表符。等價(jià)于\x0b和\cK。
\w 匹配包括下劃線的任何單詞字符。類似但不等價(jià)于“[A-Za-z0-9_]”,這里的"單詞"字符使用Unicode字符集。
\W 匹配任何非單詞字符。等價(jià)于“[^A-Za-z0-9_]”。
\xn 匹配n,其中n為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。例如,“\x41”匹配“A”?!癨x041”則等價(jià)于“\x04&1”。正則表達(dá)式中可以使用ASCII編碼。
\num 匹配num,其中num是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。例如,“(.)\1”匹配兩個(gè)連續(xù)的相同字符。
\n 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果\n之前至少n個(gè)獲取的子表達(dá)式,則n為向后引用。否則,如果n為八進(jìn)制數(shù)字(0-7),則n為一個(gè)八進(jìn)制轉(zhuǎn)義值。
\nm 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果\nm之前至少有nm個(gè)獲得子表達(dá)式,則nm為向后引用。如果\nm之前至少有n個(gè)獲取,則n為一個(gè)后跟文字m的向后引用。如果前面的條件都不滿足,若n和m均為八進(jìn)制數(shù)字(0-7),則\nm將匹配八進(jìn)制轉(zhuǎn)義值nm。
\nml 如果n為八進(jìn)制數(shù)字(0-7),且m和l均為八進(jìn)制數(shù)字(0-7),則匹配八進(jìn)制轉(zhuǎn)義值nml。
\un 匹配n,其中n是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的Unicode字符。例如,\u00A9匹配版權(quán)符號(hào)(?)。
\p{P} 小寫 p 是 property 的意思,表示 Unicode 屬性,用于 Unicode 正表達(dá)式的前綴。中括號(hào)內(nèi)的“P”表示Unicode 字符集七個(gè)字符屬性之一:標(biāo)點(diǎn)字符。其他六個(gè)屬性:L:字母;M:標(biāo)記符號(hào)(一般不會(huì)單獨(dú)出現(xiàn));Z:分隔符(比如空格、換行等);S:符號(hào)(比如數(shù)學(xué)符號(hào)、貨幣符號(hào)等);N:數(shù)字(比如阿拉伯?dāng)?shù)字、羅馬數(shù)字等);C:其他字符。*注:此語(yǔ)法部分語(yǔ)言不支持,例:javascript。
\< \> 匹配詞(word)的開(kāi)始(<)和結(jié)束(>)。例如正則表達(dá)式<the>能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個(gè)元字符不是所有的軟件都支持的。
( ) 將( 和 ) 之間的表達(dá)式定義為“組”(group),并且將匹配這個(gè)表達(dá)式的字符保存到一個(gè)臨時(shí)區(qū)域(一個(gè)正則表達(dá)式中最多可以保存9個(gè)),它們可以用 \1 到\9 的符號(hào)來(lái)引用。

2. 使用REGEXP正則表達(dá)式查詢

以 student 表為例,使用正則表達(dá)式查詢出姓的教師:

SELECT * FROM student WHERE name REGEXP '^王';

查詢結(jié)果如下圖:

圖片描述

使用正則表達(dá)式查詢 name 字段中包含字的數(shù)據(jù):

SELECT * FROM student  WHERE name REGEXP '小';

查詢結(jié)果如下圖:

圖片描述

以 teacher 表為例,使用正則表達(dá)式匹配符合郵箱格式的數(shù)據(jù):

SELECT * FROM teacher  WHERE email REGEXP '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$';

查詢結(jié)果如下圖:

圖片描述

Tips:如上圖所示, 其中 ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 為符合郵箱匹配規(guī)則的正則表達(dá)式,查詢結(jié)果 email 的值如果不滿足此正則表達(dá)式,則該條數(shù)據(jù)不會(huì)被查詢出來(lái)。

3. 小結(jié)

本小節(jié)介紹了如何使用 REGEXP 正則表達(dá)式查詢字段匹配符合正則表達(dá)式的數(shù)據(jù),列舉了正則表達(dá)式的元字符,介紹了在 MySQL 查詢中正則表達(dá)式的基本匹配用法,需要注意的是正則表達(dá)式更多具體知識(shí)這里不做詳細(xì)的介紹,這里主要介紹如何在查詢 sql 語(yǔ)句中如何對(duì)字段進(jìn)行已有的正則表達(dá)式正則匹配,下表列舉了幾個(gè)正則表達(dá)式:

(1) 11手機(jī)號(hào)正則表達(dá)式:

^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$

(2) 域名網(wǎng)址正則表達(dá)式

^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+\.\w+)*$

(3) 日期+時(shí)間正則表達(dá)式

^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$

更多的正則表達(dá)式可根據(jù)自己的需求來(lái)改寫。