javascript 的正則表達式(分類筆記)

帶你入門(幾個小小點)

目錄

  1. 正則表達式的使用
  2. 正則表達式的基本構(gòu)成元素
  3. 正則中的類(分類)刑赶,基本的元字符 + 五個基本類,構(gòu)成正則的各種變化
  4. 正則表達式的分組 和 匹配出來的變量引用
  5. 正則的匹配原理 和 應(yīng)用

正則表達式中不能正常顯示(不能正常使用)的字符基本都可以使用轉(zhuǎn)義來解決

    $1 表示分組的第一個字符
    
    \$1 表示一個 `$1` 字符

正則表達式可以快速處理基本字符,文本,網(wǎng)址,郵箱,日期等數(shù)據(jù)

  • 日期的使用

      ^(\d{4})[/-](\d{2})[/-](\d{2})$ // 請試翻譯該正則表達式       
    
      2006/02/03
    
      test/07/sd
    
      1998-03-07
    
      12345/23/1998
    
dateRegExp.png
  • http 協(xié)議的使用

      http:\/\/(.+\.jpg)      // 請試翻譯該正則表達式
    
httpRegExp.png
  • 一些常用的正則含義

      \d  ->  digit
      
      \b  ->  word boundary
      
      \w  ->  word
      
      $   ->  End of line
      
      ^   ->  Start of line
    
      [0-9]   ->  One of: '0' - '9'
      
      [/-]    ->  One of: '/' '-'
      
      (\w)    -> group #1 word
      
      g   ->  global
       
      i   -> ignore case
    
1.小葵花媽媽課堂正式開課啦. 哈哈,上面的你要是不熟悉就當我是在裝逼格高啦!

  1. 兩種實例化RegExp對象的方法 (先來看看 regExp 哥哥長什么1樣子)

    小時候是這樣(長得中規(guī)中矩)

     var reg = new RegExp("正則表達式",修飾符); // 修飾符是啥赡突?后面聊
    

    長大了長這樣(這 TM 長的就很隨意啦)

     var reg = /正則表達式/修飾符
    

    像上面這樣寫就可以生成一個 正則對象啦

  2. 聊聊修飾符 (長相很隨意,發(fā)型來幫忙)

     g (global): 全文搜索,不添加g睬隶,搜索到第一個匹配停止;
    
     i (ignore case) : 忽略大小寫页徐,不添加則默認為大小寫敏感理疙;
    
     m ( multiple lines):多行搜索
    
     g i m 可以一起使用
    
  3. 元字符(就像信息有一元分詞,二元分詞等)。就是作為正則表達式的基本構(gòu)成體

     注意:這里的元字符是一個整體并不是簡單的一個字符
     
     a,b,c .... 表示一個個元字符
     
     \t, \v, \n ... 也表示一個個元字符
     
     $1, $2 ... 也表示一個個元字符
    
    • 作為基本字符的元字符(不解釋泞坦。窖贤。。)

    • 特殊字符作為元字符 基本構(gòu)成體贰锁,既然是體赃梧,肯定有線條,有孤獨豌熄,有凹有凸授嘀。。锣险。蹄皱。

        下面你看到的這些都是元字符
        
        $ ^ | . + ? [] {} ()
      
        \t  水平制表符
        \n  換行符
        ......
      

      特殊字符我們暫且叫 她 元字體

2. 正則也是有族譜的,看看正則相關(guān)的分類

  1. 元字符

    元字符每個就代表一個意思,表示取到這個字符的意思(元字體每個也都是單獨的意思)

  2. 字符類 (何為字符類芯肤,就是將 字符拼在一塊組成一類嘛巷折。物以類聚,人以群分)

    • 構(gòu)成類, 使用 [] 將某些字符構(gòu)成一類 表示或的意思

        [abc] a 或者 b 或者 c
        
        [0123456789] 0 或者  1 或者 2 ...等我吐完這口老血一定說到 9                     
      

      明白了沒崖咨?構(gòu)成類表示或者意思

      char.png
    • 字符類取反, ^ 表示取反的意思

        [^abc]      //不是 a,也不是 b, 也不是 c..
      
        [^0123456789]       // 小明你來念
      

      取反表示取這些之外字符锻拘。

    NoneOf.png
  3. 范圍類 0-9, a,-z, 12-15 就表示一個范圍呀 表示這個范圍內(nèi)或的意思

    范圍類需要結(jié)合字符類一起使用,表示這個范圍里的或者

    范圍類是個閉區(qū)間

     直接上栗子
     
     [0123456789]    // 原來你這樣寫的
     
     [0-9] // 范圍類這樣寫的
    
    number.png
     [abcdefghigklmnopqrstuvwxyz]    // 原來這樣寫的
     
     [a-zA-Z]    //范圍類這樣寫 還比原來寫的多
    
    letter.png
  4. JavaScript預(yù)定義類

    預(yù)定義類就是 正則 覺得你寫東西不容易击蹲,他幫你 預(yù)定義一些好用的 類(有一種冷是你媽媽覺得你冷)

    chartClass.png
     解釋一下:
     
     1. 
         d -> digit
         s -> space
         w -> word
     
     2. 
         使用之前的 字符類 + 范圍類 等也可以實現(xiàn) 預(yù)定義類 的匹配署拟,but 預(yù)定義類不是更簡單嗎
     
         \d 和 \D 大小寫正好是取反
     
         \s 和 \S 大小寫取反
     
         。歌豺。推穷。。类咧。   更多的大小寫取反
    
  5. 量詞奥濉G聪獭!骗露!

    1. 所謂量詞就是表示多少數(shù)量的詞岭佳,從 0 - n 滿足你花樣的數(shù)量匹配的需求。

      numberword.png

    2. 伴隨量詞而來的另一個問題萧锉,到底匹配多少次

       '12345678'.replace(/\d{3, 6}/g, 'X'); // 誰能聊聊這個到底匹配了幾個字符
       
       悄悄告訴圣僧珊随,正則默認采用的的是貪婪模式(正則就像貪食蛇一樣盡可能多的匹配)
      

      正則的 貪婪模式 和非貪婪模式 (因為其伴隨著量詞而生,所有總在量詞后面柿隙,使用一個 ? 來區(qū)分

       '12345678'.replace(/\d{3,6}/g, 'X');  // X78 貪婪模式
       '12345678'.replace(/\d{3,6}?/g, 'X');  // XX 78  非貪婪模式
      
  6. 邊界類

    邊界類就是取字符的邊界 (文檔都應(yīng)該有 上下左右留白,正則也是很有要面子的)

    bianjie.png
    b -> boundary  // 解釋一下 b 代表的單詞
3. 從這里開啟新征程

  1. 分組 所謂分組就是將 組內(nèi)的整體當做元字符 使用叶洞。

     (byron){3}  // 分組將 byron 作為整體
     
     (byron|capital) // 分組將 byron或者capital 作為整體
     
     by(ron|cap)ital     // 分組將 ron或者cap 作為整體
    
    group.png
  1. 分組的引用 每個小小的分組其實都有一個默認的引用 (拿啥引,拿錢引唄)

     '2015-11-21'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1')   // "21/11/2015"
     
     看見沒 
     $3 就表示 第三個分組(括號) 里面的 內(nèi)容
     $2 就表示 第二個分組(括號) 里面的 內(nèi)容
     $1 就表示 第一個分組(括號) 里面的 內(nèi)容
     
     這就是分組的引用
    
  2. 忽略分組 有些分組我們不想要怎么辦禀崖?衩辟?

    (?:內(nèi)容) 使用 ?: 就表示可以忽略該分組

     比如我們想在寫的亂七八糟的數(shù)據(jù)里面找日期并且換種顯示方式
     
     '2015-asdasd-11-21'.replace(/(\d{4})-(?:\w+)-(\d{2})-(\d{2})/, '$3/$2/$1');   // "21/11/2015"
    

有個小問題? [] 中括號 表示或者的意思波附,而 | 豎線 也表示或者的意思艺晴,這兩者有何區(qū)別?

4. 來看看 正則表達式的匹配原理是什么

記住四個字: 前瞻 后顧
meatch.png

正則表達式的前瞻:

1,正則表達式是從文本頭部向尾部開始解析掸屡,從文本尾部向文本前部封寞,稱為‘前’

2,前瞻就是在正則表達式匹配到規(guī)則時,向前檢查是否符合斷言仅财。

所謂的前瞻就是在正則表達式匹配到某個字符的時候狈究,往“尚未解析過的文本”預(yù)先看一下,看是不是符合/不符合匹配模式盏求,
    而后顧抖锥,就是在正則引擎已經(jīng)匹配過的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我們又稱為肯定式匹配和否定式匹配碎罚。

反向/否定匹配稱為斷言不符合

qiznhan.png
    本節(jié)課程基本沒有實用性磅废,大家了解就好!;昴;苟住!0铱肌!
5. 看看真正的正則表達式強人是怎么煉成的 (實踐證明全局和非全局是非常重要的)

  1. 正式表達式本質(zhì)是個啥潭兽?是個對象呀(一幫叫做正則表達式對象)

    是對象就應(yīng)該有屬性和方法倦始,下面來看看 (五大三粗少一粗 就是五個屬性兩個方法

    • 屬性 有下面五個
    attr.png
       reg.global, reg.ignoreCase, reg.multiline 都是只讀的正則屬性
    
    • 解釋一下這個 lastIndex

      與正則表達式相關(guān)的術(shù)語 : 當前表達式 + 最后一個字符 + 下一個字符

        有的同學(xué)說我這個正則表達式結(jié)果不穩(wěn)定呀,
         這個 test 只有第一次完全正確山卦,以后都是不確定的鞋邑,這個怎么辦诵次?
        其實就是 lasrIndex 在作怪,下面詳細說明
        
        var reg = /\w/g
        
        reg.test(a);    // true
        reg.test(a);    // false
      
    • 正則表達式的方法

      • test Reg 對象屬性 表示 測試后面的字符是否能在前面的 test 中找到

          test 只是用于測試是否存在枚碗,不關(guān)系 lastIndex...一些詳細信息
        
      • exec RegExp.prototype.exec 正則更詳細的信息在這里

        exec.png
          exec 后結(jié)果解析:
          
          匹配到了文本 返回數(shù)組 若沒有 匹配到的文本則返回null
          
          reg.index 表示匹配文本的第一個字符串
          
          reg.input 表示被檢索的字符串
        

        exec 在全局和非全局 (有 g 和沒有 g) 結(jié)果下有不一樣的結(jié)果

        非全局下

          lastIndex == 0 (而且一直為零)
        

        全局情況下

          lastIndex 隨著匹配的前瞻而變化
        
  2. 字符串的正則匹配方法 ** 四個大漢**

    使用這四個方法進行匹配時逾一,就算傳入的參數(shù)不是正則,javascript 也會盡可能嘗試將參數(shù)轉(zhuǎn)為正則

    • String.prototype.search(reg/str/...);

      特點:

        方法返回第一個匹配結(jié)果的index,查找不到返回-1肮雨;
      
        方法不執(zhí)行全局匹配遵堵,它將忽略標志g,
        
        總是從字符串的開始進行檢索(總是從頭開始查找)
      
    • String.prototype.match(reg/str/...)

        特點:是否全局有區(qū)別
      
        非全局情況下和 exec 的到的結(jié)果基本類似 
        
            result.index
            
            result ['匹配到的子字符串', '分組信息']
            
            result.lastIndex (沒有該屬性)
        
        全局情況下 匹配所有的匹配到的子字符串(是一個數(shù)組)
        
            result.lastIndex (沒有該屬性)
            
            result ['匹配到的子字符串1', '匹配到的子字符串2',.....] (沒有分組信息)
      
    • String.prototype.split(reg/str/...)

        特點:
            
            將匹配到的字符作為分割符號 將字符串切成數(shù)組
      
    • String.prototype.replace('reg/str/...找誰)', '替換成的樣子')

        特點:
        
            將找到的字符替換成設(shè)定的字符串
      

      replace 送額外的福利啦

      replace 需要替換的字符可以又一個函數(shù)的 callback 來承擔(dān)
      
      String.prototype.replace(reg, function(resultStr, group1, gruop2, index, sourceStr) {})
      
  3. 大家聊聊 str.match(reg)reg.exec(str) 分別有什么不同

     提示一下: 
     
         是否帶有 g(全文搜索) 
    
         返回的結(jié)果(比如結(jié)果中都有神馬怨规?index, lastIndex ....)
    
  4. 幾個常見的注意事項

    1. ^ 放在外面和放在 [] (中括號)里面是不一樣的

      ^(135|136|177|180)   // 放在外面的 ^ 表示以 某個字符開頭的
      [^135]                          // 放在 中括號里面表示取反陌宿,不包括這些字符
      
    2. ? 單獨出現(xiàn)和放在 () (小括號中) 是不一樣的

      ? 放在單獨出現(xiàn)表示一個量詞   // 表示 問號 前面的量詞出現(xiàn) 零次或者一次
              [123]?  // 表示 1 或者 2 或者 3 ,三個數(shù)字最多出現(xiàn)一次
      
      ? 放在小括號中                          // 表示前瞻 后顧 負前瞻波丰,負 后顧
      
            前瞻: exp1(?=exp2)     查找exp2前面的exp1
            后顧:  (?<=exp2)exp1   查找exp2后面的exp1
            負前瞻:  exp1(?=exp2)     查找后面不是exp2的exp1
            負后顧:  (?<=exp2)exp1   查找前面不是exp2的exp1
            
            可以發(fā)現(xiàn)壳坪,負前瞻、負后顧就是把前瞻掰烟、后顧中的"="改成了"!"
      
           示例:
               (?<=博)客(?=園)    // 表示只 匹配到 博客園 中的 客 字
               (?<!博)客(?!園)      // 表示只匹配其他字符串中的 客 字爽蝴,不匹配 博客園 字符串中的客
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纫骑,隨后出現(xiàn)的幾起案子霜瘪,更是在濱河造成了極大的恐慌,老刑警劉巖惧磺,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颖对,死亡現(xiàn)場離奇詭異,居然都是意外死亡磨隘,警方通過查閱死者的電腦和手機缤底,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來番捂,“玉大人个唧,你說我怎么就攤上這事∩柙ぃ” “怎么了徙歼?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鳖枕。 經(jīng)常有香客問我魄梯,道長,這世上最難降的妖魔是什么宾符? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任酿秸,我火速辦了婚禮,結(jié)果婚禮上魏烫,老公的妹妹穿的比我還像新娘辣苏。我一直安慰自己肝箱,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布稀蟋。 她就那樣靜靜地躺著煌张,像睡著了一般。 火紅的嫁衣襯著肌膚如雪退客。 梳的紋絲不亂的頭發(fā)上骏融,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音井辜,去河邊找鬼绎谦。 笑死,一個胖子當著我的面吹牛粥脚,可吹牛的內(nèi)容都是我干的窃肠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刷允,長吁一口氣:“原來是場噩夢啊……” “哼冤留!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起树灶,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤纤怒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后天通,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泊窘,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年像寒,在試婚紗的時候發(fā)現(xiàn)自己被綠了烘豹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诺祸,死狀恐怖携悯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筷笨,我是刑警寧澤憔鬼,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站胃夏,受9級特大地震影響轴或,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜构订,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一侮叮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悼瘾,春花似錦囊榜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烫扼,卻和暖如春曙求,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背映企。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工悟狱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堰氓。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓挤渐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親双絮。 傳聞我的和親對象是個殘疾皇子浴麻,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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