摘要:點(diǎn)號(hào)正則中,有一個(gè)特殊的特殊的元字符,點(diǎn)號(hào),它可以匹配任意字符,除了換行符。表各種量詞的轉(zhuǎn)義量詞轉(zhuǎn)義形式除此之外,元字符點(diǎn)也需要加反斜線(xiàn)來(lái)進(jìn)行轉(zhuǎn)義。
??我們知道,在正則表達(dá)式中,可以使用[0-9]或d來(lái)匹配單個(gè)數(shù)字字符,但是,如果需要驗(yàn)證一個(gè)更復(fù)雜的字符串呢,比如大陸地區(qū)的郵政編碼。
??不過(guò)郵政編碼并沒(méi)有特別規(guī)定,只有由6個(gè)數(shù)字組成的字符串而已, 如246512,根據(jù)[0-9]或d,我們可以很快的實(shí)現(xiàn)匹配的正則表達(dá)式,ffffdffffd。
??從上可以看出,我們重復(fù)用了6個(gè)單個(gè)字符來(lái)實(shí)現(xiàn)匹配,由于目前數(shù)字較少,看著還可以接受,那如果不是6個(gè)數(shù)字組成的,10個(gè)?20個(gè)?甚至是更多呢,顯然這種方式是不行的,正則表達(dá)式提供了量詞,用來(lái)限定出現(xiàn)的次數(shù),可以很好解決這個(gè)問(wèn)題。
首先,看下量詞的表示形式:
量詞的一般形式 表:一般形式量詞 | 說(shuō)明 |
---|---|
{n} | 量詞前面的元素必須出現(xiàn)n次 |
{n,m} | 量詞前面的元素至少出現(xiàn)n次,最多出現(xiàn)m次 |
{n,} | 量詞前面的元素至少出現(xiàn)n次,無(wú)上限 |
{,m} | 量詞前面的元素可以不出現(xiàn),也可以出現(xiàn),最多出現(xiàn)m次(javascript不支持這種寫(xiě)法) |
/^[0-9]{2}$/.test("12") // => true /^[0-9]{2}$/.test("123") // => false /^[0-9]{2,5}$/.test("123") // => true /^[0-9]{2,5}$/.test("123456") // => false /^[0-9]{2,}$/.test("123456") // => true /^[0-9]{0,5}$/.test("123456") // => false /^[0-9]{0,5}$/.test("12") // => true /^[0-9]{0,5}$/.test("") // => true注意:
1、{n,m}之間的逗號(hào)后面不能出現(xiàn)空格,否則無(wú)法正確匹配。
/^[0-9]{0, 5}$/.test("12") // => false
2、量詞限定的出現(xiàn)次數(shù)一般都有明確下限,如果沒(méi)有,則默認(rèn)為0,所以推薦{,m}寫(xiě)成{0,m},這是通用的寫(xiě)法。
/^[0-9]{,5}$/.test("12") // => false常用量詞
{n,m}是通用形式的量詞,正則表達(dá)式還有3個(gè)常用的量詞,分別是+、?、*,雖然形式不同于{n,m},但功能確實(shí)相同的,可以當(dāng)作是“量詞的簡(jiǎn)介法”。
表:常用量詞常用量詞 | {n,m}等價(jià)形式 | 說(shuō)明 |
---|---|---|
* | {0,} | 可能出現(xiàn),也可能不出現(xiàn),出現(xiàn)次數(shù)沒(méi)有上限 |
+ | {1,} | 至少出現(xiàn)次數(shù)為1,出現(xiàn)次數(shù)沒(méi)有上線(xiàn) |
? | {0,1} | 最多出現(xiàn)1次,有可能不出現(xiàn)(出現(xiàn)0次或1次) |
/^d+(.d+)*$/.test("123") // => true /^d+(.d+)*$/.test("123.123") // => true /^d+(.d+)*$/.test("123.123.111") // => true /^d+(.d+)*$/.test("123.") // => false /^travell?er$/.test("traveller") // => true /^<[^>]+>$/.test("") // => true /^<[^>]+>$/.test("") // => true /^<[^>]+>$/.test("<>") // => false /^travell?er$/.test("traveler") // => true /^travell?er$/.test("traveller") // => true在實(shí)際開(kāi)發(fā)中,很多情況用這三種表示形式幾乎可以滿(mǎn)足,因此使用頻率要高于{n,m}。
點(diǎn)號(hào)正則中,有一個(gè)特殊的特殊的元字符,點(diǎn)號(hào).,它可以匹配任意字符,除了換行符( )。
如果需要用點(diǎn)號(hào)匹配任意字符,則必須在單行內(nèi)匹配,或者使用其他的方式來(lái)替代,如[sS]、[wW]或[dD]。
但在實(shí)際開(kāi)發(fā)中,許多人為了圖省事,很多情況下會(huì)這樣使用,這樣濫用點(diǎn)號(hào)將會(huì)帶來(lái)一些問(wèn)題。如:
new RegExp("^.*$").exec("quoted "string "") new RegExp("^(([a-z]+)s")+$").exec("quoted "string "")如上,匹配的結(jié)果將會(huì)是整個(gè)字符串:"quoted "string "",這就是我們常說(shuō)的貪婪模式。
匹配優(yōu)先量詞
要弄清楚為什么會(huì)是這個(gè)結(jié)果,則必須了解表達(dá)式的匹配原理,以".*"為例。
在正則表達(dá)式中,點(diǎn)號(hào).可以用來(lái)匹配除了換行符之外的所有字符,而*表示匹配的字符串長(zhǎng)度沒(méi)有限制,所以在".*"匹配過(guò)程中,每遇到一個(gè)字符, ".*"都可以匹配,到底是匹配它,還是忽略它,將其留給最后的"來(lái)匹配呢?
答案是由量詞來(lái)決定的,在正則表達(dá)式中量詞分為幾類(lèi),匹配優(yōu)先量詞(貪婪量詞)和忽略?xún)?yōu)先量詞(惰性量詞)(還有一種支配量詞,這里就不介紹了,請(qǐng)自行百度)匹配優(yōu)先量詞,顧名思義,在拿不準(zhǔn)是否匹配某個(gè)字符時(shí),優(yōu)先嘗試匹配,并且記下這個(gè)狀態(tài),以備將來(lái)“反悔”。
忽略?xún)?yōu)先量詞
具體過(guò)程:
一開(kāi)始,"匹配",然后到字符q,.*可以匹配q,也可以不匹配,但使用了匹配優(yōu)先量詞*,所有.*會(huì)嘗試先匹配q,并且記錄下這個(gè)狀態(tài)。
接下來(lái)是字符字符u,.*可以匹配u,也可以不匹配,但使用了匹配優(yōu)先量詞*,所有.*會(huì)嘗試先匹配u,并且記錄下這個(gè)狀態(tài)。
...
輪到字符",.*可以匹配",也可以不匹配,但使用了匹配優(yōu)先量詞*,所有.*會(huì)嘗試先匹配",并且記錄下這個(gè)狀態(tài)。
最后是字符串末尾的",.*可以匹配",也可以不匹配,但使用了匹配優(yōu)先量詞*,所有.*會(huì)嘗試先匹配",并且記錄下這個(gè)狀態(tài)。
這個(gè)時(shí)候,字符串后面已經(jīng)沒(méi)有字符了,但是正則表達(dá)式中還是有"沒(méi)有匹配,所以只能查看之前保存的備用狀態(tài),看看能不能回退幾步,以便匹配",于是讓.*后退幾步,以便讓"可以匹配",發(fā)現(xiàn)正好可以匹配,所以整個(gè)匹配宣告結(jié)束,這個(gè)“反悔”的過(guò)程,專(zhuān)業(yè)術(shù)語(yǔ)叫回溯。忽略?xún)?yōu)先量詞,與匹配優(yōu)先量詞相反,在不確定是否匹配某個(gè)字符時(shí),會(huì)優(yōu)先選擇“不匹配”的狀態(tài),在嘗試匹配表達(dá)式之后的字符,如果匹配失敗,則再回溯,選擇之前保存的“匹配的”狀態(tài),這樣保證了匹配的正確性。
表:匹配優(yōu)先量詞與忽略?xún)?yōu)先量詞
只需要把.*改為.*?即可變成忽略?xún)?yōu)先量詞。
具體過(guò)程: 類(lèi)似于匹配優(yōu)先量詞
這種匹配可以用于完成很多功能,比如匹配注釋?zhuān)瑯?biāo)簽等。轉(zhuǎn)義
匹配優(yōu)先量詞 忽略?xún)?yōu)先量詞 * *? + +? ? ?? {n} {n}? {n,m} {n,m}? {n,} {n,}? {,m} {,m}? 在正則表達(dá)式中,+、?、*等量詞是特殊字符,具有特殊含義,但是有些情況下,只想表達(dá)字符自身,則需要轉(zhuǎn)義,即在字符前加反斜線(xiàn)。對(duì)于一般形式的量詞{n,m},雖然含有特殊含義的字符不止一個(gè),但轉(zhuǎn)義時(shí)只需要給{添加反斜線(xiàn)即可,如需要匹配{n,m},則是{n,m}。
表:各種量詞的轉(zhuǎn)義
注意:忽略?xún)?yōu)先字符不像一般形式字符{n,m}一樣,只需要添加一個(gè)反斜線(xiàn),如*?,必須都要添加反斜線(xiàn),即正則表達(dá)式必須寫(xiě)作:*?,而不是*?,后者的意思是“*這個(gè)字符有可能出現(xiàn),有可能不出現(xiàn)”。
量詞 轉(zhuǎn)義形式 * * + + ? ? *? *? +? +? ?? ?? {n} {n} {n,m} {n,m} {n,} {n,} {,m} {,m} 除此之外,元字符點(diǎn).也需要加反斜線(xiàn)來(lái)進(jìn)行轉(zhuǎn)義。
由于點(diǎn).表示除了換行符之外的字符,也包括點(diǎn)號(hào)(.),所以很多人忽略了對(duì)其轉(zhuǎn)義,但如果忽略了對(duì)其轉(zhuǎn)義,則在嚴(yán)格匹配點(diǎn)號(hào)時(shí)會(huì)出錯(cuò)。比如匹配小數(shù)(3.14)、IP地址(192.168.1.1)、Email地址([email protected])等,所以若是要匹配的文本包含點(diǎn)號(hào),一定不要忘了對(duì)其進(jìn)行轉(zhuǎn)義,否則會(huì)出現(xiàn)如下的出錯(cuò):/^d+.d+$/.test("3.14") // => true /^d+.d+$/.test("3@14") // => true /^d+.d+$/.test("3.14") // => true /^d+.d+$/.test("3@14") // => false正則分析1、密碼長(zhǎng)度在6-12個(gè)字符之間
2、只能由小寫(xiě)字母,數(shù)字和橫線(xiàn)組成
3、開(kāi)頭和結(jié)尾不能為橫線(xiàn)
4、不能全部為數(shù)字
5、不允許有連續(xù)(2個(gè)及以上)的橫線(xiàn)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94771.html
摘要:本篇主要解疑正則表達(dá)式的占有型量詞。貪婪型結(jié)果在不做任何額外處理情況下,正則表達(dá)式默認(rèn)是貪婪型的。結(jié)果皆為注意括號(hào)。說(shuō)點(diǎn)什么占有量詞是一種用來(lái)組織正則表達(dá)式嘗試所有排列組合的方式。 針對(duì)*、+、?等限定符都是貪婪的(盡可能多的匹配字符),通過(guò)在最后追加+或?量詞可改變貪婪性。本篇主要解疑正則表達(dá)式的占有型量詞(Possessive Quantifiers)。 Greediness(貪婪...
摘要:忽略大小寫(xiě)全文查找出現(xiàn)的所有匹配字符多行查找全文查找忽略大小寫(xiě)所以使用之后可以這樣寫(xiě)表示忽略大小寫(xiě)匹配或者正式入門(mén)正則正則其實(shí)就是用來(lái)匹配字符串的。惰性量詞使用方法基本量詞該量詞和貪婪量詞就像,一個(gè)是消極怠工,一個(gè)是積極工作。 以前看了許許多多的正則教程,收貨并不多,往往都是蜻蜓點(diǎn)水,一點(diǎn)就過(guò)。事實(shí)上,正則用處真的超級(jí)大,比如匹配innerHTML的內(nèi)容,以及表單驗(yàn)證,也是非他莫屬。這...
摘要:對(duì)于任何有過(guò)編程經(jīng)驗(yàn)的人來(lái)說(shuō),他對(duì)正則表達(dá)式應(yīng)該不會(huì)感到陌生。元字符正則表達(dá)式的威力源于它可以在模式中擁有選擇和重復(fù)的能力。一些字符被賦予特殊的涵義,使其不再單純的代表自己,模式中的這種有特殊涵義的編碼字符稱(chēng)為元字符。 對(duì)于任何有過(guò)編程經(jīng)驗(yàn)的人來(lái)說(shuō),他對(duì)正則表達(dá)式應(yīng)該不會(huì)感到陌生。 正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來(lái)...
摘要:近幾日對(duì)自己一直不太擅長(zhǎng)的正則表達(dá)式做了一次全面的掃盲。量詞在正則中,通常要表示一個(gè)表達(dá)式匹配的數(shù)量,這個(gè)時(shí)候量詞就登場(chǎng)了。而正則默認(rèn)是貪婪模式的。正則會(huì)默認(rèn)對(duì)捕獲組分配組數(shù)。 近幾日對(duì)自己一直不太擅長(zhǎng)的正則表達(dá)式做了一次全面的掃盲。心疼自己之余還是有一些收獲吧,在這里做一個(gè)比較零散的總結(jié),整理一些對(duì)理解正則比較有利的點(diǎn)。 一、? 你沒(méi)有看錯(cuò),就是黑人問(wèn)號(hào)中的問(wèn)號(hào),這個(gè)字符在正則里面算...
摘要:寫(xiě)一個(gè)正則表達(dá)式來(lái)測(cè)試變量中是否包含字符串。用函數(shù)給出不使用字符,但和等價(jià)的正則表達(dá)式。第十四課標(biāo)志全局匹配標(biāo)志第二個(gè)常用的標(biāo)志是全局匹配標(biāo)志,用字母表示。寫(xiě)出一個(gè)正則表達(dá)式來(lái)檢驗(yàn)合法性。非捕獲組的主要用途是給一個(gè)組賦予量詞。 TRY REGEX 是一個(gè)交互式的正則表達(dá)式學(xué)習(xí)項(xiàng)目項(xiàng)目地址:https://github.com/callumacra...在線(xiàn)地址:http://tryre...
閱讀 1797·2021-09-26 09:46
閱讀 3056·2021-09-22 15:55
閱讀 2640·2019-08-30 14:17
閱讀 3060·2019-08-26 11:59
閱讀 1843·2019-08-26 11:35
閱讀 3181·2019-08-26 10:45
閱讀 3180·2019-08-23 18:28
閱讀 1199·2019-08-23 18:21