JavaScript基礎(chǔ)(二)正則表達(dá)式初級

JavaScript正則表達(dá)式基本使用

  • 定義正則表達(dá)式:var reg=/java/; var reg2=new RegExp('java')

第一部分锭部、javaScript中正則有關(guān)的幾個函數(shù)

  1. String.prototype.search

    • 找出字符串中某個字符串首次出現(xiàn)的位置
    'i love javaScript'.search(/love/); //2
    
    'i love javaScript'.search(/like/);//-1
    
  2. String.prototype.replace(regexp|substr,newSubStr|function)

    • 形參:regexp為正則對象或者正則字面量,全局的時(shí)候需要g政基,sub為要被替換的字符串思杯,newSubStr為用于替換的新字符串胜蛉,其中可以插入一些特殊變量名,function改函數(shù)的返回值將替換掉第一個參數(shù)的匹配結(jié)果色乾。
    • 替換正則匹配的子字符串,返回替換后的新字符串誊册,原先的不變
    'i love javaScript'.replace(/love/,'like') //i like javaScript
    

    使用字符串作為參數(shù),替換字符串可以插入如下變量名

    字符 替換文本
    1,2 與正則中的第1到99個子表達(dá)式想匹配的文本
    $& 與正則相匹配的字串
    $` 匹配子串左側(cè)文本
    $' 匹配字串右側(cè)文本
    $$ 美元符號$
    • replace的第二個參數(shù)可以為函數(shù)暖璧,函數(shù)的參數(shù)是匹配到的串兒
  3. String.prototype.split(separator,limit)

    • 形參:separator為字符串或者正則案怯,limit需要的數(shù)組的長度
    • 返回值:分割字符串,以數(shù)組的形式反回
    • 注意:
      • 如果分隔符是包含捕獲括號的正則表達(dá)式澎办,則每次分隔符匹配時(shí)嘲碱,捕獲括號的結(jié)果會被拼接到數(shù)組中,并不是瀏覽器都支持
    'love'.split('',3)
    //['l','o','v']
    
    'i love javascript i like node js'.split(/l[oi][vk]e/)
    // ["i ", " javascript i ", " node js"]
    
    'i love javascript i like node js'.split(/(l[oi][vk]e)/)
    // ["i ", "love", " javascript i ", "like", " node js"]
    
    ''.split(';')
    // ['']
    
    ''.split('')
    // []
    
    'love'.split('')
    // ['l','o','v','e']
    
  4. String.prototype.match

    • 捕獲字符串的子字符串到一個數(shù)組中局蚀,默認(rèn)只匹配一個
    'i love java javaScript'.match(/java/)
    // ["java", index: 7, input: "i love java javaScript"]
    
    'i love java javaScript'.match(/java/g)
    //["java", "java"]
    
    
  5. RegExp.prototype.test

    • 用來測試字符串中是否含有子字符串
    /javaScript/.test('i love javaScript') //true
    
  6. RegExp.prototype.exec

    • exec方法一次只能匹配一個子字符串,即使含有g(shù)
    var reg = /script/g;
    var str = 'i love javascript and typescript Javascript'
    
    reg.exec(str)
    // ["script", index: 11, input: "i love javascript and typescript Javascript"]
    reg.lastIndex //17
    
    reg.exec(str)
    //["script", index: 26, input: "i love javascript and typescript Javascript"]
    reg.lastIndex //32
    
    reg.exec(str)
    // ["script", index: 37, input: "i love javascript and typescript Javascript"]
    reg.lastIndex //43
    
    reg.exec(str)
    // null
    reg.lastIndex // 0
    
    reg.exec(str)
    // ["script", index: 11, input: "i love javascript and typescript Javascript"]
    
    reg.lastIndex //17
    

第二部分麦锯、正則表達(dá)式基礎(chǔ)

  • 更多詳細(xì)教程請參考:菜鳥教程鏈接

  • 元字符

    字符 匹配規(guī)則
    \d 匹配數(shù)字,大寫取反
    . 除換行符以外的任意字符
    \w 匹配字母數(shù)字下劃線琅绅,大寫取反
    \s 匹配空白符號扶欣,大寫取反
    \b 匹配單詞邊界
    ^$ 開始結(jié)束
    \num 對所獲取的匹配的引用 '(.)\1' 匹配兩個連續(xù)的相同字符
  • 數(shù)量有關(guān)

    字符 規(guī)則
    {n} 匹配n次
    {n,} 至少比n次
    {n,m} 匹配n-m次
    * 等價(jià)于{0,}
    + 等價(jià)于{1,}
    ? 等價(jià)于{0,1}
    • 貪婪與懶惰:正則表達(dá)式匹配盡量多的字符,例如/test\d*//.match('test123')返回test123千扶。在標(biāo)識符后添加?可以使其匹配盡量少的字符料祠。
  • 字符范圍

    字符 匹配規(guī)則
    [a-z] 匹配a-z任意字符
    [\u4E00-\u9FA5] 找出Unicode編碼范圍是\u4e00到\u9FA5的字符,判斷是否有漢子
  • 分組

    • ():匹配并獲取匹配
    • replacer函數(shù)中澎羞,JavaScript可以用1...9獲取對應(yīng)內(nèi)容
      'i love javaScript'.replace(/(love)/,'$1 $1')
      //'i love love javaScript'
      
    • match函數(shù):表達(dá)式有全局屬性時(shí)髓绽,捕獲所有符合的表達(dá)式,沒有全局屬性時(shí)妆绞,匹配第一個結(jié)果梧宫,將匹配到的字符串放入結(jié)果數(shù)組
      'i love java javaScript'.match(/(java)/)
      
      //["java", "java", index: 7, input: "i love java javaScript"]
      
      'i love java javaScript'.match(/(java\w*\b)/g)
      //  ["java", "javaScript"]
      
      'i love java javaScript'.match(/(java\w*) (java\w*)/)
      //  ["java javaScript", "java", "javaScript", index: 7, input: "i love java javaScript"]
      
    • exec函數(shù):忽略全局屬性,只返回一個結(jié)果和分組結(jié)果
      /(java) (javaScript)/g.exec('i love java javaScript java javaScript')
      
      // ["java javaScript", "java", "javaScript", index: 7, input: "i love java javaScript java javaScript"]
      
  • 分支條件:'|'分支條件影響兩邊所有內(nèi)容

    'javaScript typeScript'.match(/(java|type)Script/g)
    // ["javaScript", "typeScript"]
        
    'javaScript typeScript'.match(/java|typeScript/g)
    // ["java", "typeScript"]
    
  • 斷言

    • (?=exp):用來捕獲正則表達(dá)式的后面摆碉,捕獲括號內(nèi)前面的內(nèi)容塘匣,不分配組號
      'i love javaScript'.match(/l\w+\s+(?=java\w*)/)
      
      // ["love ", index: 2, input: "i love javaScript"]
      
    • (?!exp):用在正則表達(dá)式后面,捕獲后面不是括號內(nèi)的字符
    • (?:exp):會匹配分組中的內(nèi)容巷帝,但是不再分配組號忌卤,在replace,match等函數(shù)中作用也會消失楞泼。例如驰徊, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達(dá)式
      'i love javaScript'.match(/(java\w*)/)
      
      //  ["javaScript", "javaScript", index: 7, input: "i love javaScript"]
      
      'i love javaScript'.match(/(?:java\w*)/)
      
      //["javaScript", index: 7, input: "i love javaScript"]
      
  • 三個處理選項(xiàng):

    內(nèi)容 標(biāo)記 文字描述
    i ignoreCase 忽略大小寫
    g globle 全局匹配
    m mutiple 多行匹配

第三部分笤闯、正則表達(dá)式高級

  • 工作原理
    ,正則表達(dá)式在JavaScript中執(zhí)行主要分為以下四個部分棍厂,編譯=>設(shè)置開始位置=>正則匹配=>匹配結(jié)果這四部分

第四部分颗味、ES6的正則擴(kuò)展

  • 構(gòu)造函數(shù):RegExp構(gòu)造函數(shù)第一個參數(shù)是正則對象,第二個參數(shù)指定修飾符時(shí)會忽略原有正則的修飾符牺弹。
  • 字符串對象的四個方法match浦马、replace、search张漂、split內(nèi)部全部調(diào)用RegExp的實(shí)例方法晶默,例如search調(diào)用RegExp.prototype[Symbol.search]
  • u修飾符:用來正確處理大于\uFFF的Unicode字符,可以正確處理4個字節(jié)的UTF-16編碼
  • y修飾符(粘連sticky):與g相似航攒,g只要求剩余位置中存在匹配就可以磺陡,y需要確保匹配從剩余的第一個位置開始。設(shè)計(jì)本質(zhì)是讓頭部匹配標(biāo)志^在全局匹配中都有效
  • sticky屬性漠畜,表示是否設(shè)置了y修飾符
  • flag屬性:返回正則的修飾符
  • s修飾符:.可以匹配任意單個非終止符(終止符:換行符\n 回車符\r弥搞,行分隔符辩昆,段分隔符)筹吐,引入/s修飾符鳄逾,使得可以匹配任意單個字符酱鸭,與之對應(yīng)的dotAll表示是否處在doAll模式下抖仅。
  • V8 4.9已經(jīng)支持后行斷言
  • 具名組匹配瞧筛,為每個分組起一個名字
  • 此部分參考ES6標(biāo)準(zhǔn)入門

第五部分侠碧、常用正則表達(dá)式

第六部分硝枉、實(shí)例

// 將字符串中所有的<img/>標(biāo)簽替換為<span/>標(biāo)簽
textHTML.replace(/(<img.+?text="\S+".+?>)/gi,
      match => match.replace(/<img.+text="(\S+?)".+>/, '<span>$1</span>')
// 校驗(yàn)URL
/^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))|localhost)(?::\d{2,5})?(?:(/|\?|#)[^\s]*)?$/

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廉丽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妻味,更是在濱河造成了極大的恐慌正压,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件责球,死亡現(xiàn)場離奇詭異焦履,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)雏逾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嘉裤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栖博,你說我怎么就攤上這事屑宠。” “怎么了仇让?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵典奉,是天一觀的道長躺翻。 經(jīng)常有香客問我,道長卫玖,這世上最難降的妖魔是什么公你? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮假瞬,結(jié)果婚禮上陕靠,老公的妹妹穿的比我還像新娘。我一直安慰自己笨触,他們只是感情好懦傍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芦劣,像睡著了一般粗俱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虚吟,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天寸认,我揣著相機(jī)與錄音,去河邊找鬼串慰。 笑死偏塞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邦鲫。 我是一名探鬼主播灸叼,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼庆捺!你這毒婦竟也來了古今?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滔以,失蹤者是張志新(化名)和其女友劉穎捉腥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體你画,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抵碟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坏匪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟逮。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖适滓,靈堂內(nèi)的尸體忽然破棺而出唱歧,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布颅崩,位于F島的核電站几于,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沿后。R本人自食惡果不足惜沿彭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尖滚。 院中可真熱鬧喉刘,春花似錦、人聲如沸漆弄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撼唾。三九已至廉邑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倒谷,已是汗流浹背蛛蒙。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渤愁,地道東北人牵祟。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像抖格,于是被迫代替她去往敵國和親诺苹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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