JS 正則表達(dá)式總結(jié)

0、前言

??作為一名前端開發(fā)者,在做表單驗(yàn)證或者寫一些gulp任務(wù)或webpack配置時(shí)都不可避免的會(huì)用到正則料皇,雖然零零散散看過一些正則相關(guān)語法啥辨,但始終覺得沒吃透涡匀,直到遇到這篇文章(強(qiáng)烈推薦)。本文僅記錄個(gè)人覺得很有價(jià)值的幾個(gè)點(diǎn)溉知。

1陨瘩、正則語法

正則是匹配模式,要么匹配字符级乍,要么匹配位置舌劳。

對(duì)于一個(gè)字符串string='hello',你應(yīng)該這樣看待它:


也就是要看成字符和位置的集合玫荣,而不是單單的是字符甚淡。

  • 字符組
    范圍表示法:[a-z]從a到z的所有小寫字母;
    排除字符組:[^a-z]除a-z以外的所有字符捅厂;
    常見縮寫:\d贯卦,\D,\w焙贷,\W撵割,\s,\S辙芍,.啡彬,其中'.'匹配任意非換行符、回車符故硅、行分隔符和段分隔符外遇。
    此外,若要匹配任意字符契吉,可用:[\d\D]跳仿、[\w\W]、[\s\S]和[^]中任何的一個(gè)捐晶。

  • 多選分支

    (p1|p2|p3)菲语,其中p1妄辩、p2和p3是子模式,用|(管道符)分隔山上,表示其中任何之一

    注意:分支結(jié)構(gòu)是惰性的眼耀,當(dāng)?shù)谝粋€(gè)子模式匹配成功后,后面的模式會(huì)被忽略

  • 位置匹配符(6個(gè))

    ^ $ \b \B (?=p) (?!p)

    ^:開始的位置佩憾;
    $:結(jié)束的位置哮伟;
    \b:單詞邊界,具體就是\w和\W之間的位置妄帘,也包括\w和^之間的位置楞黄,也包括\w和$之間的位置;
    \B:\b的取反抡驼;
    (?=p):p之前的位置鬼廓,正向先行斷言;
    (致盟?!p):上述取反碎税,反向先行斷言;
    把位置理解空字符馏锡,是對(duì)位置非常有效的理解方式雷蹂。同一個(gè)位置可以有多個(gè)空字符,就像^和首字母之間還可以有其它空位置一樣

  • 括號(hào)的作用
    1杯道、分組和分支

    /(ab)+/         //分組
    /^I love (JavaScript|Regular Expression)$/       //分支
    

    2匪煌、分組引用
    主要是方便獲取小括號(hào)匹配到的內(nèi)容

    //1、match方法蕉饼,有小括號(hào)時(shí)虐杯,返回的數(shù)組中包含小括號(hào)匹配的內(nèi)容
    var regex = /(\d{4})-(\d{2})-(\d{2})/;
    var string = "2017-06-12";
    console.log( string.match(regex) ); 
    // => ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12"]
    
    //2、API引用法昧港,使用replace時(shí)可直接用$1等獲取小括號(hào)內(nèi)容
    var regex = /(\d{4})-(\d{2})-(\d{2})/;
    var string = "2017-06-12";
    regex.test(string); // 正則操作即可擎椰,例如
    //regex.exec(string);
    //string.match(regex);
    console.log(RegExp.$1); // "2017"
    console.log(RegExp.$2); // "06"
    console.log(RegExp.$3); // "12"
    
    //3、反向引用 \1,\2
    var regex = /\d{4}(-|\/|\.)\d{2}\1\d{2}/;
    var string1 = "2017-06-12";
    var string2 = "2017/06/12";
    var string3 = "2017.06.12";
    var string4 = "2016-06/12";
    console.log( regex.test(string1) ); // true
    console.log( regex.test(string2) ); // true
    console.log( regex.test(string3) ); // true
    console.log( regex.test(string4) ); // false
    

    3创肥、非捕獲分組
    非捕獲分組的意義在于不引用括號(hào)的內(nèi)容达舒,節(jié)省內(nèi)存

    var regex = /(?:ab)+/g;
    var string = "ababa abbb ababab";
    console.log( string.match(regex) ); 
    //=>RegExp.$1值為'''',不用非捕獲模式時(shí)為"ab"
    
  • 符號(hào)的優(yōu)先級(jí)
    一個(gè)正則表達(dá)式涉及的操作符有:

    1.轉(zhuǎn)義符 \
    2.括號(hào)和方括號(hào) (...)叹侄、(?:...)巩搏、(?=...)、(?!...)趾代、[...]
    3.量詞限定符 {m}贯底、{m,n}、{m,}撒强、?禽捆、*笙什、+
    4.位置和序列 ^ 、$胚想、 \元字符琐凭、 一般字符

    1. 管道符(豎杠)|.

    上面操作符的優(yōu)先級(jí)從上至下,由高到低浊服。

2统屈、寫好正則的建議

  • 使用具體型字符組來代替通配符,來消除回溯
    少用通配符'.'牙躺,減少回溯次數(shù)愁憔,提升匹配速度
  • 使用非捕獲型分組(?:)
    當(dāng)必須要用括號(hào),又不想引用時(shí)述呐,使用非捕獲型分組可節(jié)省內(nèi)存
  • 獨(dú)立出確定字符
    例如/a+/惩淳,可以修改成/aa*/蕉毯。后者能比前者多確定了字符a乓搬,可加快判斷是否匹配失敗,進(jìn)而加快移位的速度
  • 提取分支公共部分
    比如/abc|def/代虾,修改成/^(?:abc|def)/进肯。這樣做,可以減少匹配過程中可消除的重復(fù)棉磨。
  • 減少分支的數(shù)量江掩,縮小它們的范圍
    /red|read/,可以修改成/rea?d/乘瓤。此時(shí)分支和量詞產(chǎn)生的回溯的成本是不一樣的环形。

3、正則相關(guān)JS函數(shù)

String類型四個(gè)+RegExp類型二個(gè)衙傀,常用的是3+1

  • match
    當(dāng)全局匹配時(shí)抬吟,match返回所有匹配結(jié)果,數(shù)組形式统抬;
    當(dāng)局部匹配時(shí)火本,match返回一個(gè)結(jié)果和其它信息,如index,input,數(shù)組形式聪建;
    當(dāng)沒有匹配到數(shù)據(jù)時(shí)钙畔,返回null

    var string = "2017.06.27";
    var regex1 = /\b(\d+)\b/;
    var regex2 = /\b(\d+)\b/g;
    console.log( string.match(regex1) );
    console.log( string.match(regex2) );
    // => ["2017", "2017", index: 0, input: "2017.06.27"]
    // => ["2017", "06", "27"]
    
  • split
    1、接受第二個(gè)參數(shù)金麸,表示分割后數(shù)組的長(zhǎng)度擎析;
    2、和match一樣挥下,當(dāng)?shù)谝粋€(gè)參數(shù)是字符串時(shí)會(huì)將其轉(zhuǎn)為正則表達(dá)式揍魂,因此建議不要傳字符串挪鹏,而是直接傳正則

  • replace
    1、第二個(gè)參數(shù)可以是字符串或者函數(shù)愉烙,當(dāng)是函數(shù)時(shí)讨盒,第一個(gè)參數(shù)表示整個(gè)匹配的內(nèi)容,然后依次是括號(hào)匹配的內(nèi)容步责,再然后是index和input返顺;
    2、str.replace返回的是新字符串蔓肯,str本身并未被改變遂鹊,即replace是不改變?cè)甲址摹?/p>

  • test

    /\d+/.test(123);//true
    

4、總結(jié)

本文是結(jié)合自身情況對(duì)老姚的這篇文章進(jìn)行的總結(jié)蔗包。收獲如下:

  • 操作符優(yōu)先級(jí):轉(zhuǎn)義>括號(hào)>量詞>普通字符>管道符
  • 正則表達(dá)式不光匹配字符秉扑,還匹配位置
  • 位置符:^ $ (?=b) (?!b) \b \B,其中\(zhòng)b是\w與\W之間的位置调限,(?=b)是b之前的位置
  • ^與首字母之間還可以有位置舟陆,尾字母和$同理。即同一個(gè)位置可以有多個(gè)空白字符耻矮。
  • 寫好正則的建議 -第二節(jié)

5秦躯、案例

  • 把"12345678",變成"12,345,678"
var string1 = "12345678",
string2 = "123456789";
reg = /(?!^)(?=(\d{3})+$)/g;

var result = string1.replace(reg, ',')
console.log(result); 
// => "12,345,678"

result = string2.replace(reg, ',');
console.log(result); 
// => "123,456,789"

(?!^) 表示非開頭的位置
(?=(\d{3})+$) 表示從結(jié)尾的位置開始往前連續(xù)三個(gè)數(shù)字之前的位置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裆装,一起剝皮案震驚了整個(gè)濱河市踱承,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哨免,老刑警劉巖茎活,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琢唾,居然都是意外死亡载荔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門慧耍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來身辨,“玉大人,你說我怎么就攤上這事芍碧』蜕海” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵泌豆,是天一觀的道長(zhǎng)定庵。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么蔬浙? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任猪落,我火速辦了婚禮,結(jié)果婚禮上畴博,老公的妹妹穿的比我還像新娘笨忌。我一直安慰自己,他們只是感情好俱病,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布官疲。 她就那樣靜靜地躺著,像睡著了一般亮隙。 火紅的嫁衣襯著肌膚如雪途凫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天溢吻,我揣著相機(jī)與錄音维费,去河邊找鬼。 笑死促王,一個(gè)胖子當(dāng)著我的面吹牛犀盟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硼砰,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼且蓬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼欣硼!你這毒婦竟也來了题翰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤诈胜,失蹤者是張志新(化名)和其女友劉穎豹障,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焦匈,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡血公,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缓熟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片累魔。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖够滑,靈堂內(nèi)的尸體忽然破棺而出垦写,到底是詐尸還是另有隱情,我是刑警寧澤彰触,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布梯投,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏分蓖。R本人自食惡果不足惜尔艇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望么鹤。 院中可真熱鬧终娃,春花似錦、人聲如沸蒸甜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迅皇。三九已至昧辽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間登颓,已是汗流浹背搅荞。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留框咙,地道東北人咕痛。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喇嘱,于是被迫代替她去往敵國(guó)和親茉贡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 作為一名攻城獅者铜,對(duì)正則表達(dá)式一定不會(huì)很陌生腔丧,但在平時(shí)開發(fā)中有時(shí)依然會(huì)遇到這樣或那樣的問題。本文從基礎(chǔ)出發(fā)作烟,本著讓初...
    艾特TT閱讀 2,014評(píng)論 3 12
  • 初衷:看了很多視頻愉粤、文章,最后卻通通忘記了拿撩,別人的知識(shí)依舊是別人的衣厘,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 3,993評(píng)論 0 20
  • 正則表達(dá)式到底是什么東西压恒?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位影暴,可能是字母,數(shù)字探赫,標(biāo)點(diǎn)符號(hào)型宙,空格,換行符期吓,漢字等...
    獅子挽歌閱讀 2,141評(píng)論 0 9
  • 允許的修飾符 有些修飾符能在所有允許的地方出現(xiàn), 但并非所有的都這樣. 通常, 影響 regex 編譯的修飾符(...
    焉知非魚閱讀 1,329評(píng)論 0 1
  • 溫馨提示:文章很長(zhǎng)很長(zhǎng)谱姓,保持耐心借尿,必要時(shí)可以跳著看,當(dāng)然用來查也是不錯(cuò)的屉来。 正則啊路翻,就像一座燈塔,當(dāng)你在字符串的海...
    Stinson閱讀 4,318評(píng)論 2 82