溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

正則表達(dá)式的實(shí)例解析

發(fā)布時(shí)間:2020-11-09 14:03:43 來(lái)源:億速云 閱讀:205 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下正則表達(dá)式的實(shí)例解析,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

正則表達(dá)式是我們驗(yàn)證是經(jīng)常見(jiàn)到的!下面我和大家一起分享一下如何更簡(jiǎn)單的理解正則表達(dá)式。
首先,說(shuō)一下正則名字的命名:

這個(gè)單詞我想大家都會(huì)眼熟吧!“Regular Expression”。  Regular Expression的“Regular”一般被譯為“正則”、“正規(guī)”、“常規(guī)”。此處的“Regular”即是“規(guī)則”、“規(guī)律”的意思,Regular Expression即“描述某種規(guī)則的表達(dá)式”之意,也就是我們所說(shuō)的正則表達(dá)式。其實(shí)正則表達(dá)式說(shuō)白了就是用來(lái)規(guī)范某種行為的!或者說(shuō)是一種約束,就好比我們必須遵守交通規(guī)則是的。
我個(gè)人感覺(jué)如果想把正則搞懂、搞明白也不難!只要把其中的一些必須記住的東西外,再加上靈活的運(yùn)用,這樣就可以了!
好的! 接下來(lái)我就來(lái)深入到正則的主體,
我們來(lái)先看看正則關(guān)鍵的東西,如果把這些東西都搞明白了!一般在項(xiàng)目中就沒(méi)有問(wèn)題了!

第一個(gè)“\”
這個(gè)是俗稱(chēng)轉(zhuǎn)義字符,就是把一個(gè)字符標(biāo)記為一個(gè)特殊字符或者原義字符。如:“n” 就是匹配“n”  。如果是“\n”  則是換行符。
有人該問(wèn)了如果我就是想寫(xiě)“\”這個(gè)斜杠呢? 這個(gè)也很簡(jiǎn)單??!就直接是這樣寫(xiě)“\\”就可以了!為什么寫(xiě)兩個(gè)“\\”呢!就是為了區(qū)分。

第二個(gè)“^”
這個(gè)是俗稱(chēng)開(kāi)始字符,就是說(shuō)準(zhǔn)備寫(xiě)正則了!如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹配“\n”或者“\r”之后的位置。

第三個(gè)“$”
這個(gè)是俗稱(chēng)結(jié)束字符,也可以說(shuō)成收尾(很不專(zhuān)業(yè)的解釋?zhuān)?!如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹配“\n”或“\r”之前的位置

第四個(gè)“*”
這個(gè)是匹配前面的子表達(dá)式零次或者多次。如:zo*能匹配“z”以及“zo”或者“zoo”。這個(gè)“*”也就是相當(dāng)于{0,}

第五個(gè)“+”
這個(gè)是匹配前面的子表達(dá)式一次或者多次。如:“zo+”能匹配“zo”以及“zoo”或者“zooo”。這個(gè)“*”和“+”差不多一個(gè)是開(kāi)始零次一個(gè)是一次。這個(gè)“+”相當(dāng)于{1,}。

第六個(gè)“?”
這個(gè)是匹配前面的子表達(dá)式零次或者一次。如:“do(es)?”可以匹配“do”或者“does”。這個(gè)問(wèn)號(hào)的意思就是要么匹配零次要么匹配一次!

第七個(gè)“{}”
這個(gè)符號(hào)是匹配多少次的,
1,{n}匹配確定的n次,n是一個(gè)非負(fù)整數(shù),如:“o{2}”這個(gè)的意思就是匹配兩個(gè)“oo”, 如: good,food等!不過(guò)不能匹配body,因?yàn)榫鸵粋€(gè)o!
2,{n,}匹配至少n次,n是個(gè)非負(fù)整數(shù),如:“o{2,}” 這個(gè)的意思就是匹配兩個(gè)以上的“oo”,如:good,goood,gooood等?!皁{1,}”等價(jià)于“o+”?!皁{0,}”這個(gè)等價(jià)于“o*”。
3,{n,m}這個(gè)是最少匹配n次最多匹配m次,n和m都是非負(fù)整數(shù),其中n<=m。例如:“o{1,3}”匹配body,food,foood。不過(guò)不匹配fooood?!皁{0,1}”等價(jià)于“o?”。這里寫(xiě)的時(shí)候要注意一下,就是逗號(hào)和兩個(gè)數(shù)之間不能有空格。

第八個(gè)“?”特殊用法
當(dāng)該字符緊跟在任何一個(gè)其他限制符(*,+,?,{n},{n,},{n,m})后面時(shí),匹配模式是非貪婪的。所謂非貪婪就是以最少為好,非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串“oooo”,“o+?”將匹配單個(gè)“o”,而“o+”將匹配所有“o”。

第九個(gè)“.”
匹配除換行符“\n”之外的任何單個(gè)字符。如果想匹配換行符“\n”再內(nèi)的任何字符,就使用“(.|\n)”的模式。

第十個(gè)“pattern”
這個(gè)“pattern”不是很好理解,剛一看比較暈!不過(guò)我對(duì)這個(gè)的理解如下希望對(duì)大家有用:
1. ?:pattern 匹配pattern但不獲取匹配結(jié)果, 例如:k(?:1|2|3) k在123中任意匹配一個(gè),例子:k1|k2
2. ?=pattern 正向肯定預(yù)查 例如:K(?=1|2|3) 當(dāng)K匹配123中任意一個(gè)時(shí) 選擇K  例子:k1中的k或者k2中的k
3. ?!pattern 正向否定預(yù)查 例如:k(?!1|2|3) 當(dāng)K不匹配123中的任意一個(gè)時(shí) 選擇K 例子:不匹配k1中的k,不過(guò)可以是k4,k5
4. ?<=pattern 反向肯定預(yù)查 例如:(?<=1|2|3)k 當(dāng)K匹配123中任意一個(gè)時(shí) 選擇K 例子:1k中的k或者2k中的K
5. ?<!pattern 反向否定預(yù)查 例如:(?<!1|2|3)k 當(dāng)k不匹配123中任意一個(gè)時(shí) 例子:不匹配1k中的K可以是4k,5k

第十一個(gè)“|”
這個(gè)符號(hào)就是或的意思,比如:“f|good”能匹配“f”或“good”,如果這樣呢“(f|g)ood”則匹配“food”或“good”。

第十二個(gè)“[]”
這個(gè)符號(hào)是字符集和的意思,和“{}”看上去差不多,不過(guò)意義可就差多了。

第十三個(gè)“()”
這個(gè)符號(hào)式數(shù)組或者是集合

1、[xyz]  匹配所包含的任意一個(gè)字符。就是說(shuō)三個(gè)之中選擇一個(gè)。例子:“[abc]”可以匹配“company”中的“a”不過(guò)不可以匹配“beautiful”因?yàn)橛玫搅死锩娴膬蓚€(gè)字母。
2、[^xyz] 這個(gè)是負(fù)值字符集合,也可以說(shuō)成是“非”。例子:“[^abc]”可以匹配“drop”等!只要單詞里沒(méi)有“abc”這三個(gè)字母就可以。
3、[a-z] 字符的范圍。匹配指定范圍內(nèi)的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫(xiě)字母字符。也可以寫(xiě)成“[0-9]”這個(gè)是匹配0到9直接打數(shù)字。
4、[^a-z] 這個(gè)我想不用說(shuō)大家就應(yīng)該想到是什么意思了,對(duì)了!就是你想的那個(gè)意思:不在“a”到“z”范圍內(nèi)的任意字符,一開(kāi)始我看到這個(gè)的時(shí)候以為是不在a到z之間的字母呢!我說(shuō)如果不在a到z之間的字母那只有漢語(yǔ)中的“ü” 了!這個(gè)好像讀“喻”!呵呵! 大家看清楚了??!是字符,不是字母。

下面大家和我一起看看“\”和字母所匹配的特殊含義,
“\b” 這個(gè)是匹配一個(gè)單詞的邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。這個(gè)我感覺(jué)比較好記大家可以這樣記:邊界的邊是b開(kāi)頭的!
“\B”這個(gè)是和“\b”是相反的,匹配非單詞邊界?!癳r\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
“\d”這個(gè)是用的比較多!我建議大家對(duì)這個(gè)多記記,這個(gè)是匹配數(shù)字字符,相當(dāng)于[0-9]。
“\D”這個(gè)也很好理解,也是相反的意思就是說(shuō)不是數(shù)字的,相當(dāng)于[^0-9]。
“\f”這個(gè)是匹配一個(gè)換頁(yè)符。這個(gè)不做過(guò)多解釋了!下面的四個(gè)也就過(guò)多不做過(guò)多解釋了。只要記住就可以了!在項(xiàng)目中會(huì)用就可以了!
“\n”這個(gè)是匹配一個(gè)換行符。
“\r”這個(gè)是匹配一個(gè)回車(chē)符。
“\t”這個(gè)是匹配一個(gè)制表符。
“\v”這個(gè)是匹配一個(gè)垂直制表符。
“\s”這個(gè)匹配任何空字符,匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于[ \f\n\r\t\v]。也就是這個(gè)把上面的五個(gè)都包括了!
“\S”這個(gè)是非空白字符等價(jià)于[^ \f\n\r\t\v]。
說(shuō)到這里大家都可能感覺(jué)到正則其實(shí)就是這些字符嘛!而且有些是可以靠我們的邏輯思維推理出來(lái)的,而且有些是重復(fù)的,只要大家能夠靈活的運(yùn)用就可以了。

“\w”這個(gè)是匹配包括下劃線的任何單詞字符。等價(jià)于“[A-Za-z0-9_]”。這個(gè)在實(shí)際中用的也挺多的也建議大家多記記這個(gè)。

“\W”這個(gè)是匹配非單詞數(shù)字字符。等價(jià)于“[^A-Za-z0-9_]”。

好的!基本上要記得就是這么多了!這些可能有些正則高手該說(shuō)了“你這個(gè)根本不全???” 我先提前解釋一下吧,我所寫(xiě)的只是一些基礎(chǔ)的,在項(xiàng)目中常見(jiàn)的,比較實(shí)用的,基本上這些在項(xiàng)目中就可以運(yùn)用自如了。
接下來(lái)呢,和大家做一些實(shí)質(zhì)性的東西,和大家一起解析一些正則表達(dá)式。
比如這個(gè)正則:^([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$
這個(gè)正則我想對(duì)正則高手來(lái)說(shuō)一看就知道是什么了。當(dāng)然一些邏輯思維比較強(qiáng)的看兩眼也就知道這個(gè)是什么了,沒(méi)錯(cuò)就是時(shí)間正則。

OK 我們來(lái)解析一下這個(gè)正則從這個(gè)“^”開(kāi)始,“([0-1]?[0-9]|2[0-3])”是個(gè)組,“[0-1]?”這個(gè)問(wèn)號(hào)的作用是0或1最多有零個(gè)或者一個(gè),“[0-9]”0至9之間任意一個(gè)數(shù),“|”這個(gè)是“或”的意思,就是說(shuō)不是“[0-1]?[0-9]”就是“2[0-3]”,“2[0-3]” 這個(gè)是前面的2就是代表2,后面0至3是0到3之間任意一個(gè)數(shù),“:”就是代表“:”,“([0-5][0-9])”也是個(gè)組,“[0-5]”是0到5之間任意一個(gè)數(shù),“[0-9]”是0到9之間任意一個(gè)數(shù),“:”也是本意,“([0-5][0-9])”也是個(gè)組,“[0-5]”是0到5之間任意一個(gè)數(shù),“[0-9]”是0到9之間任意一個(gè)數(shù),“$”這個(gè)是結(jié)束符。
再和大家解析一個(gè)小數(shù)

比如:^[1-9]+\d*(\.[0-9]{1,2})?|0(\.[0-9]{1,2})?$
“^”是開(kāi)始符,“[1-9]+”其中“+”的意思是1到9之間最少有一個(gè)或者多個(gè),“\d*”這個(gè)“\d”是數(shù)字,這個(gè)“*”是最少有零個(gè)數(shù)字或者有多個(gè)數(shù)字,“(\.[0-9]{1,2})?”這個(gè)組里面“\.”是原意點(diǎn),“[0-9]{1,2}” 0到9之間有一個(gè)或者有兩個(gè)數(shù)字,后面這個(gè)問(wèn)號(hào)“?”意思是有零個(gè)或者一個(gè)它“(\.[0-9]{1,2})”。“|” 是要么是“[1-9]+\d*(\.[0-9]{1,2})?”要么是“0(\.[0-9]{1,2})?”?!?(\.[0-9]{1,2})?”這個(gè)里面的0是原意,“(\.[0-9]{1,2})?”這個(gè)組里面“\.”是原意點(diǎn),“[0-9]{1,2}” 0到9之間有一個(gè)或者有兩個(gè)數(shù)字,后面這個(gè)問(wèn)號(hào)“?”意思是有零個(gè)或者一個(gè)它“(\.[0-9]{1,2})”。

下面我例舉出一些常見(jiàn)的正則表達(dá)式來(lái)給大家說(shuō)說(shuō):

^[1-9]\d*$ //匹配正整數(shù)   
^-[1-9]\d*$ //匹配負(fù)整數(shù)   
^-?[1-9]\d*$ //匹配整數(shù)   
^[1-9]\d*|0$ //匹配非負(fù)整數(shù)(正整數(shù) + 0)   
^-[1-9]\d*|0$ //匹配非正整數(shù)(負(fù)整數(shù) + 0)   
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮點(diǎn)數(shù)   
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配負(fù)浮點(diǎn)數(shù)   
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮點(diǎn)數(shù)   
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0)   
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$  //匹配帳號(hào)是否合法(字母開(kāi)頭,允許5-16字節(jié),允許字母數(shù)字下劃線)
^\s*|\s*$  //匹配首尾空白字符的正則表達(dá)式
\n\s*\r  //匹配空白行的正則表達(dá)式
[^\x00-\xff]  //匹配雙字節(jié)字符(包括漢字在內(nèi))
[\u4e00-\u9fa5]  //匹配中文字符的正則表達(dá)式

用戶名
^[a-z0-9_-]{3,16}$

密碼
^[a-z0-9_-]{6,18}$

十六進(jìn)制值
^#?([a-f0-9]{6}|[a-f0-9]{3})$

電子郵箱
^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$
^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$

URL
^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

IP 地址
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)


^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

HTML 標(biāo)簽
^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$

看完了這篇文章,相信你對(duì)正則表達(dá)式的實(shí)例解析有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI