成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

正則之基本入門(mén)

ormsf / 2219人閱讀

摘要:忽略大小寫(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)證,也是非他莫屬。這里,我結(jié)合js,對(duì)正則進(jìn)行一個(gè)簡(jiǎn)單的介紹吧。 如有紕漏歡迎指出,希望大家多多包涵。

js與正則的關(guān)系

在js中定義一個(gè)正則有兩種方法,一個(gè)是實(shí)例化,一個(gè)是字面量。
分別看一下:

//字面量
var re = /w+/;   //這兩者等價(jià)
//實(shí)例化
var re = new RegExp("w+");

如果想添加一些flags也是沒(méi)有問(wèn)題的。
比較常用的flag有。/i,/g,/ig,/m.

/i (忽略大小寫(xiě),ignore)
/g (全文查找出現(xiàn)的所有匹配字符,global)
/m (多行查找,multiLine)
/ig(全文查找、忽略大小寫(xiě),ignore+global)

所以, 使用flag之后可以這樣寫(xiě).

var reg = ^d{5,12}i$  ;//表示忽略大小寫(xiě),匹配;
//或者
var reg = new RegExp(^d{5,12}i$);
正式入門(mén)正則

正則其實(shí)就是用來(lái)匹配字符串的。他用一個(gè)簡(jiǎn)潔表達(dá)了,完成了你需要寫(xiě)很多代碼的事,就和md(markdown)語(yǔ)法是一個(gè)道理。 用的人多了,自然成標(biāo)準(zhǔn),這也是規(guī)則吧。

正則預(yù)定字符

預(yù)定字符,就是用程序比較難表達(dá)的一些字符,比如回車鍵,tab鍵(通過(guò)空格來(lái)區(qū)分達(dá)到的效果).
常用的有:

字符 效果
t 制表符,其實(shí)就是一個(gè)“Tab”鍵
r 回車符,如果你使用過(guò)word應(yīng)該之后,在一個(gè)段落后面那個(gè)東西吧。 :)
n 換行符,他和r是有故事的,等下說(shuō),我們繼續(xù)

恩,大部分就是這幾個(gè)了。 上面提到 r和n,他們到底有什么卻別。 沒(méi)錯(cuò),看字面量,感覺(jué)return 不就是換行嗎? 其實(shí),這樣說(shuō)沒(méi)錯(cuò),但是得區(qū)分系統(tǒng),在Unix為擴(kuò)展的系統(tǒng),在每行的結(jié)尾只有"n",而在window下則是:"rn"(順序不能換). 所以,為了解決系統(tǒng)的差異,就出現(xiàn)了兩種: r || n.
所以一般,我們匹配換行需要使用.r||n一起使用.

var reg = /[
]/g;

這樣就能保證系統(tǒng)的兼容性.

字符類

所謂的字符類同樣也是將你平常要花很多時(shí)間做出來(lái)的,集成為一個(gè)簡(jiǎn)潔表達(dá)。(相當(dāng)于寫(xiě)庫(kù))。
常用的字符類有如下幾個(gè)。

字符 效果
. 匹配換行符以外的任意字符
d 匹配所有數(shù)字
D 匹配非數(shù)字
s 匹配一個(gè)空格符
S 匹配非空格
w 匹配字母數(shù)字下劃線=>其實(shí)就是匹配單詞word(簡(jiǎn)單易懂)
W 匹配!字母數(shù)字下劃線=>就是不匹配單詞

來(lái)我們看幾個(gè)例子

console.log(/s+/.test("     "));  //true
console.log(/d+/.test("1234231"));  //true
console.log(/D+/.test("  "));  //true

其他的如上。

錨字符

這個(gè)應(yīng)該算是正則里面,取名最好理解的一個(gè)。使用正則就是停船一樣,你需要設(shè)置你停的位置,我也需要設(shè)置我的邊界。
常用的有一下幾個(gè):

錨字符 效果
^ 匹配字符串的開(kāi)頭,在多行檢索中,匹配一行的開(kāi)頭
$ 匹配字符串的結(jié)尾,在多行檢索中,匹配一行的結(jié)尾
b 匹配一個(gè)單詞的邊界
B 匹配非單詞邊界

這幾個(gè)應(yīng)該算是我平常用的最多的幾個(gè)吧。
如果你想匹配整個(gè)字符串,就可以組合使用"^ $";

var reg = /^d+$/;  //匹配整個(gè)字符串為數(shù)字
量詞字符

"望文生義",這類字符使用來(lái)限定某某出現(xiàn)的次數(shù)的。
常用的有:

代碼 / 語(yǔ)法 說(shuō)明
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n, m} 重復(fù)n到m次

這個(gè)應(yīng)該不用多說(shuō)了。 直接看例子吧

console.log(/^d+$/.test("123")); //true

上面說(shuō)了這么多內(nèi)置的字符,那我想使用特定字符類怎么辦嘞。其實(shí)也很簡(jiǎn)單。使用""轉(zhuǎn)義字符。
比如我想匹配大括號(hào)."{}".我可以這樣用:

console.log(/{.+}/.test("{123}")); //true

但事實(shí)上,量詞還分為3種,有貪婪量詞,惰性量詞,支配性量詞。
區(qū)分的依據(jù)是根據(jù)引擎的解析不同而形成。
貪婪量詞
這類量詞指的就是上文所說(shuō)的: *,+,?。
他的匹配方法就是,全文匹配,如果不成功,則,將末尾的最后一個(gè)字符減去,再匹配,如果還不成功,則,再減一次。只到為0。 接著,往中間移動(dòng)一位,再進(jìn)行匹配,同樣的匹配模式。

console.log(/.+/.test("abcd"));  //true

惰性量詞
使用方法: 基本量詞 ?
該量詞和貪婪量詞就像,一個(gè)是消極怠工,一個(gè)是積極工作。 惰性量詞一開(kāi)始只會(huì)匹配一個(gè)字符,如果不成功,則在進(jìn)行匹配。

console.log(/d+?/.test("1fjkdf"));  //true

這里闡述一些惰性和貪婪匹配的區(qū)別。
我們也通常把惰性稱為最少重復(fù)匹配。
舉個(gè)例子:
我們現(xiàn)在需要匹配blablablabla. 中的b~a間的詞。
使用貪婪匹配:

var str = "blablablabla";
console.log(str.match(/(b.*a)/g));  //["blablablabla"]

我們最少重復(fù)匹配(惰性匹配)

console.log(str.match(/(b.*?a)/g));  //["bla", "bla", "bla", "bla"]

支配性量詞
使用方法: 基本量詞 +;
該量詞就是只匹配一次,如果不符合則不匹配。
但是由于js不支持,所以,這里也不做過(guò)多的介紹。

正則: /d*+/;

其實(shí)上面只要留個(gè)印象就可以,只有當(dāng)你真正使用的時(shí)候,你才會(huì)有感觸。
OK!!!基本內(nèi)容說(shuō)完了,現(xiàn)在輪到真正的進(jìn)階,big boom~

中括號(hào)的用法

我們從小學(xué)學(xué)過(guò)來(lái),老師告訴我們,我們使用括號(hào)有3種,一個(gè)是( ),一個(gè)是[],一個(gè)是{}.
而在正則里面,大括號(hào)已經(jīng)被量詞字符給強(qiáng)占了,只剩下[]和(). 這里我們來(lái)說(shuō)一下,中括號(hào).
[],在正則里面代表的是一個(gè)單元字符,或者我寧愿叫他"或"括號(hào). 因?yàn)樗鸬降闹饕饔镁褪牵憧梢云ヅ溥@個(gè)或者匹配那個(gè)或者...
吃個(gè)栗子:

var reg = /[abc]/;
console.log(reg.test("a"));  //true

可以看出,reg可以匹配 a|b|c. 平常使用的時(shí)候,可以直接向一個(gè)字符使用就可以了。
異或表達(dá)
這里會(huì)出現(xiàn)一個(gè)問(wèn)題,比如,我不想匹配a,b,c中的任意一個(gè)該怎么辦呢? 其實(shí),只需要在"[]"里面加上"^"即可。

console.log(/[^abc]/.test("c"));  //false

范圍字符
范圍字符,就是可以省略一些周所周知的。 比如匹配26英文字母可以直接使用:a-z. 因?yàn)槲覀円呀?jīng)都知道了這個(gè)的意義。
其實(shí),上面所說(shuō)的字符類完全就可以使用中括號(hào)來(lái)代替。

d => [0-9]
w => [0-9a-zA-Z_]
S => [^	
x0Bf
]  (f標(biāo)識(shí)分頁(yè)符)
...

另外這個(gè)范圍字符還有一個(gè)好處,就是匹配中文。(電腦都是外國(guó)人發(fā)明的呀。)

console.log(/[u4e00-u9fa5]{1}/.test("艸")); //true

這就是中括號(hào)的常用用法。

小括號(hào)使用

小括號(hào)的主要作用其實(shí)就是分組。平常是用來(lái)提取匹配到的字符串。
分組使用
使用()對(duì)內(nèi)容進(jìn)行區(qū)分。

console.log(/(jimmy)+/.test("jimmy"));  //true

而且,配合使用match方法,可以獲得匹配到的內(nèi)容.(這里不加括號(hào)也是可以的).

var name = "My name is Jimmy";
console.log(name.match(/(Jimmy)/g));  //["Jimmy"]

需要注意在括號(hào)里面寫(xiě)正則和沒(méi)有括號(hào)的時(shí)候,是沒(méi)有區(qū)別的。我們可以在()內(nèi)嵌套你想加的。(如果你想嵌套()的話,Sorry,這樣并沒(méi)有什么卵用).

var name = "My name is Jimmy Jimy";
console.log(name.match(/(Jimm?y)/g));  //["Jimmy", "Jimy"]

候選(或)
這個(gè)就相當(dāng)于將括號(hào)加上一個(gè)或的功能. 即,在()里面使用"|"進(jìn)行分隔。

var name = "My name is Jimmy sam";
var reg = /(jimmy|sam)+?/ig;
console.log(name.match(reg)); //["jimmy","sam"]

反向引用
這個(gè)名字我真心不理解,什么"反向"... 我寧愿叫做,給分組加上標(biāo)識(shí)符。這個(gè)的主要功能,就是給匹配到的小括號(hào)加上數(shù)字,來(lái)表明他是第幾個(gè)匹配到的。如果不加,則默認(rèn)從左到右的順序?yàn)?,2,3...

var reg = /(100)1/;
var reg2 = /(100)(99)(101)123/; //1=>100,2=>99,3=>101

在js中,通常是和replace搭配,才有威力。

var reg = /(100) (99)/;
var str = "100 99";
console.log(str.replace(reg,"$2 $1")); //99 100

總而言之, 小括號(hào)就是讓你使用分組的匹配. 說(shuō)回來(lái),分組有什么用呢?
實(shí)際上就是讓你的正則看起來(lái)更短而已.
看個(gè)demo你就懂分組的意義了:

var str = "name jimmy";
console.log(str.match(/(w+)s+1/));  // 這里的1 實(shí)際上就是前面的(w+)
//得到的結(jié)果為 null. 因?yàn)閚ame 不能匹配到j(luò)immy所以為null
var str = "jimmy jimmy";
console.log(str.match(/(w+)s+1/));
//得到的結(jié)果為 jimmy。 因?yàn)?w匹配到的為jimmy,所以為jimmy

上面那種方法叫做后向引用. 另外, 我們還可以顯示的使用命名. 即:(?w+)s+kfetchWord 這樣,就可以達(dá)到, 內(nèi)部正則的復(fù)用. 不過(guò), 對(duì)不起, 在js中,只支持?jǐn)?shù)組分組, 即, 按順序分配序號(hào)。和上面demo一樣.
不過(guò)在perl 系列的正則中是使用(?P< xx>) 和 g

非捕獲分組

我們直接使用 "(...)"進(jìn)行的匹配是捕獲分組。 我們來(lái)說(shuō)一下什么叫捕獲. 上文中我們使用match進(jìn)行正則匹配,而返回的數(shù)組中的元素就是通過(guò)正則捕獲的內(nèi)容。 這就叫捕獲。
那這里的非捕獲,是什么意思呢? 其實(shí)很簡(jiǎn)單,就是通過(guò)match不會(huì)匹配到內(nèi)容。但還是可以起到分組的效果。
格式為: (?:xxx)
它最常用的地方就是匹配html.

var str=` 
`; var reg = //gi; console.log(str.match(reg));

大家可以去試一試,說(shuō)到正則匹配,我還有一個(gè)想說(shuō)的,就是上文所說(shuō)的惰性匹配(最少重復(fù))和貪婪匹配。
可以看到 “/< div(?:.|r|n)*div>/gi” 我這里使用的是貪婪匹配。他的結(jié)果是,盡量匹配到最外層的< /div>標(biāo)簽。
即上面的結(jié)果為:

可以看出,貪婪匹配,對(duì)于兩個(gè)重復(fù)的/div 他會(huì)匹配到最外一層。
那我們使用惰性匹配試一試。
/< div(?:.|r|n)*?div>/gi
得到的結(jié)果為:

可以看出少了一個(gè)< /div>,原因就是,惰性匹配盡量只會(huì)匹配到第一個(gè)重復(fù)的< /div>上面的。
所以,總結(jié)一下,在使用正則匹配的時(shí)候需要搞清楚到底什么時(shí)候用惰性,什么時(shí)候用貪婪,這點(diǎn)很重要。 貪婪會(huì)匹配最外層,惰性會(huì)匹配最里層。

前瞻(零寬斷言)

前瞻分為正向前瞻和反向前瞻。(由于js只支持前瞻,所以后瞻只會(huì)提一下)。 他的作用就是,在匹配的字符后面,斷言說(shuō)后面一定符合我的正則。 (好饒~~)
算了,先說(shuō)一下基本格式吧。

正則 名稱 作用
(?=exp) 正向前瞻 匹配exp前面的位置
(?!exp) 反向前瞻 匹配后面不是exp的位置
(?<=exp) 正向后瞻 匹配exp后面的位置
(?< !exp) 反向后瞻 匹配后面不是exp的位置

看不懂了吧,我們來(lái)看一下詳細(xì)的內(nèi)容。
for instances:

var str = "happied boring";
var reg1 = /happ(?=ied)/g;
var reg2 = /bor(?!ied)/;
console.log(str.match(reg1)); //["happ"]
console.log(str.match(reg2)); //["bor"]

從這個(gè)例子可以很容易看出前瞻后瞻到底是什么了。
回到上面的匹配html的例子。
這里我們有個(gè)需求,即只留下img標(biāo)簽,那么就可以使用前瞻.

var str=` 
`; var reg = /<(?!img)(?:.| | )*?>/gi; console.log(str.replace(reg,"")); //得到的結(jié)果為:

另外,零寬斷言還有另外一個(gè)作用,即匹配以xxx為結(jié)尾的單詞。
這時(shí)候,你的leader對(duì)你有個(gè)要求,即,jimmy呀,你把ed結(jié)尾的單詞找出來(lái)哦。(好呀~)
這時(shí)候就可以使用前瞻了。

var str = "he is an interested person";
var reg = /w+(?=ed)/ig;
console.log(str.match(reg)); //["interest"]
結(jié)束語(yǔ)

關(guān)于正則的內(nèi)容大概就是這些了。 其實(shí)正則的學(xué)習(xí),不是只用看就能學(xué)會(huì)的,實(shí)踐才是硬道理。 通過(guò),理論的學(xué)習(xí),在加上踩過(guò)的坑,自然會(huì)對(duì)正則有著莫名的好感。 不過(guò),大神就是大神,取名字就是這么別扭。 什么 零寬斷言,前瞻,后瞻,反向引用 blablabla... 在理解的同時(shí)可以根據(jù)自己的理解給這些名詞冠上自己的idea.我這里只是 正則的冰山一角,正則在任意一門(mén)語(yǔ)言內(nèi),用處都是超級(jí)大的。這里安利一個(gè) 總結(jié)的比較好的正則庫(kù)。正則庫(kù). 還有一個(gè)在線的regExp測(cè)試工具.Debuggex

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78608.html

相關(guān)文章

  • 前端文檔收集

    摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...

    jsbintask 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...

    muddyway 評(píng)論0 收藏0
  • 零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)

    摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲(chóng)軟件定制開(kāi)發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲(chóng)學(xué)習(xí)系列教程(來(lái)源于某博主:htt...

    KunMinX 評(píng)論0 收藏0
  • ES6入門(mén)正則的擴(kuò)展

    摘要:正則的擴(kuò)展參數(shù)為字符串,那么第二個(gè)參數(shù)表示正則表達(dá)式的修飾符,如下等價(jià)于參數(shù)為一個(gè)正則表達(dá)式,這時(shí)返回一個(gè)原有正則表達(dá)式的拷貝。如下調(diào)用調(diào)用調(diào)用調(diào)用修飾符對(duì)正則表達(dá)式添加了修飾符,用來(lái)正確處理大于的字符。 showImg(https://segmentfault.com/img/bVbrJqm?w=800&h=1200); 1. 正則的擴(kuò)展 參數(shù)為字符串, 那么第二個(gè)參數(shù)表示正則表達(dá)式...

    jifei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

ormsf

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<