以前后端同事爬了別人家的網(wǎng)站,需要分析文本工猜,他是想要知道如何通過(guò)
ClassName
定位,后來(lái)盡然是讓我寫個(gè)正則匹配表達(dá)式馅袁。汗域慷,趁記憶力的熱乎勁兒寫一篇非常規(guī)文章。
?正則表達(dá)式是什么
???正則表達(dá)式是一個(gè)描述字符模式的對(duì)象汗销,按照人的語(yǔ)言習(xí)慣犹褒,當(dāng)我們讀一段文字的時(shí)候第一印象,下面有一段文字弛针,我們可以通過(guò)多種方式描述它叠骑,而每一種方式描述的都是下面一段文字:
###幾種使用情況
····處理字符串
··需要從一段字符串中提取想要的部分 ->match exec
··需要將一段字符串中的一部分替換組成新的字符串 ->replace
··需要將一段字符串處理成想要的數(shù)組 ->split
····判斷字符串
··判斷字符串是需要的 ->test
··判斷字符串是需要的,并確定匹配位置 ->search
###組織正則語(yǔ)言
要匹配的字符串str
正則/a(\d+)[abc]rico(?=wang)/
/ a (\d+) [abc] rico(?=wang)/
str是否有a
↙ ↘
no yes → 至少要有一個(gè)數(shù)字
↙ ↘
no yes → 返回()匹配的結(jié)果 → → 括號(hào)內(nèi)容會(huì)被`exec` `match`最后返回
↓
有a削茁,或者b宙枷,或者c
↙ ↘
no yes → rico后面必須跟上wang
↙ ↘
no yes → 只匹配不返回()匹配的結(jié)果
var str = 'a1cricowang'
str.match(reg) 返回:["a1crico","1"] //返回的數(shù)組第一項(xiàng)是所有匹配結(jié)果,第二項(xiàng)為()匹配的結(jié)果
var str = 'a121cricowang'
str.match(reg) 返回:["a1crico","121"] //返回的數(shù)組第一項(xiàng)是所有匹配結(jié)果茧跋,第二項(xiàng)為()匹配的結(jié)果
reg.test(str) 返回: true
? 幾種匹配符
-
\d
匹配一個(gè)非負(fù)整數(shù)慰丛, 等價(jià)于 [0-9] -
\s
匹配一個(gè)空白字符 -
\w
匹配一個(gè)英文字母或數(shù)字,等價(jià)于[0-9a-zA-Z] -
.
匹配除換行符以外的任意字符瘾杭,等價(jià)于[^\n]
?量詞
-
*
匹配零個(gè)或更多個(gè)诅病,即0~n -
+
匹配一個(gè)或更多個(gè),即至少一個(gè),1~n -
?
匹配一個(gè)或零個(gè) -
{}
一般用來(lái)表示匹配的長(zhǎng)度贤笆,比如\d{3}
表示匹配三個(gè)數(shù)字蝇棉,\d{1,3}
表示匹配1~3個(gè)數(shù)字,\d{3,}
表示匹配3個(gè)以上數(shù)字芥永。
? []
是定義匹配的字符范圍篡殷。比如 [a-zA-Z0-9] 表示字符文本要匹配英文字符和數(shù)字
- 單字符取一個(gè),比如
[abc]
會(huì)匹配a
或b
或c
- 一個(gè)
[]
的內(nèi)容一次只能匹配一個(gè)字符 -
[]
里面的特殊符有五個(gè):-,\,^
埋涧,其他字符都是普通字符板辽,包括*
,.
,?
等 -
^
在[^
的首位時(shí)候才有特殊意義 -
[a|b|c]
匹配的是a
,|
,b
,|
,c
,五個(gè)中的其中任意一個(gè)。
?()
圓括號(hào)()
是組飞袋,主要應(yīng)用在限制多選結(jié)構(gòu)的范圍/分組/捕獲文本/環(huán)視/特殊模式處理
示例:
-
(abc|bcd|cde)
戳气,表示這一段是abc
链患、bcd
巧鸭、cde
三者之一均可,順序也必須一致 -
(abc)?
麻捻,表示這一組要么一起出現(xiàn)纲仍,要么不出現(xiàn),出現(xiàn)則按此組內(nèi)的順序出現(xiàn) -
(?:abc)
表示找到這樣abc
這樣一組贸毕,但不記錄郑叠,不保存到$
變量中,否則可以通過(guò)$x
取第幾個(gè)括號(hào)所匹配到的項(xiàng)明棍,比如:(aaa)(bbb)(ccc)(?:ddd)(eee)
乡革,可以用$1
獲取(aaa)
匹配到的內(nèi)容,而$3
則獲取到了(ccc)
匹配到的內(nèi)容摊腋,而$4則獲取的是由(eee)
匹配到的內(nèi)容沸版,因?yàn)榍耙粚?duì)括號(hào)沒(méi)有保存變量 -
a(?=bbb)
順序環(huán)視 表示a后面必須緊跟3個(gè)連續(xù)的b
-
(?i:xxxx)
不區(qū)分大小寫(?s:.*)
跨行匹配.可以匹配回車符
?^
與 $
^
匹配一個(gè)字符串的開(kāi)頭,比如(^a)
就是匹配以字母a
開(kāi)頭的字符串$
匹配一個(gè)字符串的結(jié)尾,比如(b$)
就是匹配以字母b
結(jié)尾的字符串^
還有另個(gè)一個(gè)作用就是取反兴蒸,比如[^xyz]
表示匹配的字符串不包含xyz
?幾種需要轉(zhuǎn)義的:( [ { \ ^ $ | ) ? * + .] }
?string
方法,接受一個(gè)正則對(duì)象 string.fn(reg)
-
match
返回結(jié)果:存放匹配結(jié)果的數(shù)組视粮。該數(shù)組的內(nèi)容依賴于 regexp 是否具有全局標(biāo)志g
-
search
返回結(jié)果:第一個(gè)與regexp
相匹配的子串的起始位置,如果沒(méi)有找到任何匹配的子串,則返回-1
橙凳,search()
方法不執(zhí)行全局匹配蕾殴,它將忽略標(biāo)志g。 -
replace
返回結(jié)果:一個(gè)新的字符串岛啸,是用replacement
替換了regexp
的第一次匹配或所有匹配之后得到的 -
split
返回結(jié)果:一個(gè)字符串?dāng)?shù)組钓觉,按照正則匹配進(jìn)行分割而成的數(shù)組
?RegExp
對(duì)象方法,接受一個(gè)字符串 reg.fn(string)
-
test
則是用來(lái)檢測(cè)字符串是否匹配某一個(gè)正則表達(dá)式,如果匹配就會(huì)返回true,反之則返回false -
exec
返回一個(gè)數(shù)組坚踩,其中存放匹配的結(jié)果荡灾。如果未找到匹配,則返回值為 null。
?match
和exec
的區(qū)別
- 一個(gè)是字符串的方法卧晓,一個(gè)是正則的方法芬首,接受參數(shù)類型不一樣
- 在有
g
參數(shù)的全局匹配情況下,返回的結(jié)果不一樣逼裆,match
一次返回所有匹配結(jié)果郁稍,exec
是使用一次,返回一個(gè)匹配結(jié)果胜宇,下次使用返回下一個(gè)匹配結(jié)果
?貪婪模式和非貪婪模式
- 其實(shí)可以簡(jiǎn)單的理解耀怜,貪婪模式就是盡可能多的匹配,非貪婪模式就是盡可能少的匹配.
- 貪婪模式量詞:
{x,y}
,{x,}
,?
,*
, 和+
,匹配到它需要的第一個(gè)滿足條件之后,貪婪模式則會(huì)繼續(xù)向右邊進(jìn)行匹配下去 - 非貪婪模式量詞:
{x,y}?
桐愉,{x,}?
财破,??
,*?
从诲,和+?
,所以非貪婪模式就是在貪婪模式后面加了一個(gè)問(wèn)號(hào),當(dāng)它匹配到它需要的第一個(gè)滿足條件之后左痢,他就會(huì)停止了。而系洛。
?零寬正向斷言和負(fù)向斷言俊性,只做判斷是否符合()
中的規(guī)則,并不匹配()
中的規(guī)則描扯。
-
(?=)
零寬正向斷言: 括號(hào)內(nèi)表示某個(gè)位置右邊必須和=
右邊匹配上 -
(?!)
負(fù)向斷言: 括號(hào)內(nèi)表示某個(gè)位置右邊不和!后的字符匹配定页。
補(bǔ) : 發(fā)現(xiàn)缺少全面的正則基礎(chǔ)知識(shí)查找 補(bǔ)一條連接點(diǎn)這里,缺少的可以在這里找绽诚,比如說(shuō)哪個(gè)字符是匹配大小寫之類的典徊。2018.5.25更新
文章分三次更新,后期不定期更新修改