摘要:開(kāi)始一個(gè)完整的正則表達(dá)式通常由兩部分組成普通的字符不普通的元字符。元字符匹配正則表達(dá)式中有著豐富的元字符提供,這里我們選擇常用的進(jìn)行具體講解。
作為一個(gè)程序員,我們?cè)谌粘5拈_(kāi)發(fā)過(guò)程中需要對(duì)一些文本內(nèi)容進(jìn)行快速查找匹配以及內(nèi)容替換等操作,而我們最常用的方法就是通過(guò)正則表達(dá)式來(lái)實(shí)現(xiàn)。什么是正則表達(dá)式呢?我們可以理解為是一種專(zhuān)門(mén)處理文字的工具,通過(guò)制定規(guī)則來(lái)匹配文字的位置或者內(nèi)容,對(duì)結(jié)果進(jìn)行操作。
開(kāi)始一個(gè)完整的正則表達(dá)式通常由兩部分組成普通的字符、不普通的元字符。普通字符很好理解指的就是26個(gè)英文字母大小寫(xiě)a(A)~z(Z)和數(shù)字0~9,不普通的元字符從字面上可以看出點(diǎn)特殊,元字符其實(shí)就是指具備一些特殊含義的字符 例如 ".*?+^$"等,那么字符和元字符可以互轉(zhuǎn)嘛?答案是可以的,神奇的元字符反斜杠""也可以實(shí)現(xiàn)這個(gè)功能,客官別不信,我們接著看~~
字符匹配在正則表達(dá)式中我們可以通過(guò)普通的字母和數(shù)字組成最基本的匹配規(guī)則,對(duì)內(nèi)容進(jìn)行一一對(duì)應(yīng),例如 我們現(xiàn)在想在"hello,world!"中找到"hello",我們通過(guò) /hello/ 正則表達(dá)式就可以了。
但單單只通過(guò)普通字符匹配往往是不能滿(mǎn)足我們的需求的,例如 現(xiàn)在有一段內(nèi)容"***分割線***",我們希望把內(nèi)容中的""替換成"-",可""是元字符具有特殊含義,因此這個(gè)時(shí)候指通過(guò)普通字符是無(wú)法實(shí)現(xiàn)的,但通過(guò)轉(zhuǎn)義字符就可以實(shí)現(xiàn),后面我們會(huì)講到。
元字符匹配正則表達(dá)式中有著豐富的元字符提供,這里我們選擇常用的進(jìn)行具體講解。
多字符匹配在字符匹配章節(jié)我們舉例從"hello,world!"中找到"hello",我們通過(guò)一一對(duì)應(yīng)的方式篩選對(duì)應(yīng)的字符,但在實(shí)際場(chǎng)景中我們經(jīng)常會(huì)遇到一對(duì)多的情況,例如"hello,xx!","xx"對(duì)應(yīng)的可能是"world"也可能是任意其他字符,這個(gè)時(shí)候我們通過(guò)單字符匹配的話(huà)顯然很低效,如果能有一種模式涵蓋表示這類(lèi)字符豈不快哉,各位看官,現(xiàn)在我們推出第一個(gè)元字符,代表集合含義的[],集合顧名思義就是某一類(lèi)的合,現(xiàn)在我們對(duì)正則進(jìn)行改寫(xiě)即 /hello,[abc]/ ,這時(shí)候我們可以同時(shí)匹配a,b,c三個(gè)字符,但這種寫(xiě)法依然很低效,我們需要一個(gè)能表示區(qū)間的字符,區(qū)間元字符 - 正合適,這時(shí)候我們可以寫(xiě)成 /hello,[a-z]/ ,這時(shí)候我們就可以匹配所有26個(gè)小寫(xiě)英文字母了,即便如此,在某些場(chǎng)景下我們單單有集合和區(qū)間去匹配多個(gè)字符也是很低效的,所以正則表達(dá)式衍生出了很多可以匹配多個(gè)字符的簡(jiǎn)寫(xiě)方式:
正則表達(dá)式 | 含義 |
---|---|
. | 除換行符之外的任意字符 |
d | 數(shù)字 0~9 (即[0-9]) |
D | 與d相反,表示 除了數(shù)字0~9的任意字符 |
w | 26個(gè)大小寫(xiě)字母、數(shù)字、下劃線(即[a-zA-Z0-9_]) |
W | 與w相反,表示 除了基本字符和下劃線的任意字符 |
s | 空字符,包括 制表符、換頁(yè)符、換行符、空格 |
S | 與s相反,表示 非空字符? |
我們?cè)谶M(jìn)行對(duì)字符匹配的時(shí)候往往需要對(duì)匹配的字符數(shù)量進(jìn)行限制,本章節(jié)就數(shù)量元字符進(jìn)行講解,從字面意義可以看出數(shù)量元字符肯定就是對(duì)匹配字符的個(gè)數(shù)進(jìn)行限制啦,例如 同樣是上面的"hello,world",我們需要找出"hello",一種方式通過(guò)單子符匹配方式即 /hello/ ,其實(shí)我們還可以對(duì)其進(jìn)行簡(jiǎn)化,表示精確區(qū)間范圍的 {min,max} or{num}元字符,"hello"中"l"出現(xiàn)了兩次,那么我們就可以改寫(xiě)成 /hel{2}o/ ,當(dāng)然這個(gè)例子比較簡(jiǎn)單,我們換個(gè)復(fù)雜一點(diǎn)的,現(xiàn)在我們需要從"OObama like bababanana ..."中找出"ba"連續(xù)出現(xiàn)2次以上的地方,從內(nèi)容上可以看出"ba"出現(xiàn)的地方有兩處,這個(gè)時(shí)候我們實(shí)際要找的是"bababa",所以我們可以寫(xiě)成 /ba{2,}/ ,除了 {} 外,正則表達(dá)式還有很多用來(lái)數(shù)量匹配的元字符:
正則表達(dá)式 | 含義 |
---|---|
? | 匹配0或1個(gè)字符(即0|1) |
* | 匹配0或者多個(gè)字符(即0|n) |
+ | 匹配1或者多個(gè)字符(即1|n) |
{min,max} or {num} | 精確區(qū)間匹配,min表示最少,max表示最多個(gè)數(shù),num表示精確個(gè)數(shù) |
位置元字符主要是用來(lái)限制查找內(nèi)容的范圍,例如限制在內(nèi)容的開(kāi)頭或者內(nèi)容的結(jié)尾等,舉個(gè)例子 "Hello,World!Hello, China"我們想查找開(kāi)頭的"Hello",但內(nèi)容中"Hello"出現(xiàn)了兩次,因此我們需要一個(gè)可以限制查找范圍為內(nèi)容開(kāi)頭的元字符, /^/ 表示匹配表達(dá)式的開(kāi)頭,所以我們改為/^Hello/,有客官舉報(bào)說(shuō),大騙子,我通過(guò) /Hello/ 也可以匹配到,好,我們換一個(gè),現(xiàn)在改成"World is my World!",我需要匹配第二個(gè)"World",這...不慌不慌,我們通過(guò) /$/ 限制查找范圍是表達(dá)式的結(jié)尾就可以了,即 /World$/ ,除了限制范圍是開(kāi)頭、結(jié)尾,我們還可以通過(guò) // 來(lái)限制單詞的邊界,或者 /(?=xx)/ 來(lái)匹配某個(gè)(xx)前面的內(nèi)容符合表達(dá)式的字符,通過(guò) /?<=xx/ 來(lái)匹配某個(gè)后面的內(nèi)容符合表達(dá)式的字符,舉個(gè)例子現(xiàn)在有"People like apple",我想在所有ple的單詞中找到符合ple前面為"ap"的那個(gè)ple,則可以寫(xiě)成/(?<=ap)ple/,總結(jié)正則表達(dá)式中對(duì)位置進(jìn)行匹配的元字符有:
?正則表達(dá)式 | 含義 |
---|---|
^ | 匹配表達(dá)式的開(kāi)頭 |
$ | 匹配表達(dá)式的結(jié)尾 |
b | 匹配單詞的邊界 |
B | 匹配非單詞的邊界 |
(?=xx) | 向前匹配符合x(chóng)x規(guī)則的副詞 |
(?!xx) | 向前匹配不符合x(chóng)x規(guī)則的副詞 |
(?<=xx) | 向后匹配符合x(chóng)x規(guī)則的副詞 |
(? | 向后匹配不符合x(chóng)x規(guī)則的副詞 |
通過(guò)正則表達(dá)式進(jìn)行內(nèi)容匹配的時(shí)候,我們會(huì)遇到對(duì)全文內(nèi)容匹配、多行內(nèi)容匹配等場(chǎng)景,正則表達(dá)式也提供了三種模式元字符進(jìn)行模式匹配。g表示全局模式,即匹配所有的內(nèi)容;i表示忽略大小寫(xiě),即匹配內(nèi)容的時(shí)候忽略字母的大小寫(xiě);
m表示多行匹配模式,即對(duì)多行內(nèi)容進(jìn)行匹配,并且各種模式可以混合使用,例如"Hello World, hello China",我們需要匹配所有的"Hello"且不區(qū)分大小寫(xiě),即/hello/ig。
正則表達(dá)式 | 含義 |
---|---|
g | 匹配全局模式 |
i | 匹配不區(qū)分字母大小寫(xiě) |
m | 匹配多行模式 |
?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109687.html
摘要:于是找來(lái)了前輩們留下的經(jīng)典原生練習(xí)題,以期把看過(guò)的內(nèi)容用起來(lái),加深自己對(duì)原生的掌握。鼠標(biāo)移入移出改變樣式實(shí)現(xiàn)效果繼續(xù)樣式轉(zhuǎn)換,雖然用的偽類(lèi)便能實(shí)現(xiàn),但既然是的練習(xí)題就得用用鼠標(biāo)事件了。 0x0關(guān)于這個(gè)系列 差不多把《js高級(jí)程序設(shè)計(jì)》刷完了,所謂實(shí)踐出真知,尤其編程這種實(shí)踐和經(jīng)驗(yàn)相當(dāng)重要的事情,不能光說(shuō)不做。但以我現(xiàn)在的水平,直接上手那些大項(xiàng)目是還是不夠格的,還是得一步步扎實(shí)好基礎(chǔ)再有...
摘要:說(shuō)來(lái)慚愧,做前端快三年對(duì)于正則表達(dá)式的應(yīng)用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語(yǔ)法和規(guī)則,這次項(xiàng)目中多次用到了需要匹配替換的動(dòng)作,終于下定決心去研究一下了。 說(shuō)來(lái)慚愧,做前端快三年對(duì)于正則表達(dá)式的應(yīng)用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語(yǔ)法和規(guī)則,這次項(xiàng)目中多次用到了需要匹配替換的動(dòng)作,終于下定決心去研究一下了。 實(shí)例化正則對(duì)...
摘要:日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。 日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。 基本語(yǔ)法 [xyz] ...
摘要:日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。 日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。 基本語(yǔ)法 [xyz] ...
摘要:日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。 日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。 基本語(yǔ)法 [xyz] ...
閱讀 3329·2021-11-24 09:39
閱讀 2852·2021-10-12 10:20
閱讀 1943·2019-08-30 15:53
閱讀 3104·2019-08-30 14:14
閱讀 2632·2019-08-29 15:36
閱讀 1162·2019-08-29 14:11
閱讀 1982·2019-08-26 13:51
閱讀 3447·2019-08-26 13:23