正則表達式-溫故而知新

正則表達式

從新整理學習,爲了加深印象,發現了以前遺漏的一個很是重要的知識點優先選擇最左端的匹配結果,這個規則正則表達式

js上建立正則的方式

  • 直接字面量的建立數組

    const r = /xx/;    //經過雙斜槓,在中間添加匹配的規則,這樣就是一個正則表達式了
  • 經過構造函數建立ide

    const r = new RegExp('xx', g)  //經過構造函數來建立正則對象,第一個參數爲匹配規則字符串,第二個參數能夠添加修飾符,例如g,i,m,y

正則的實例方法

  • 經常使用的exec,能夠返回一個類數組,信息比較全函數

    const r = /a/g
    r.exec('asd')   //返回["a", index: 0, input: "asd", groups: undefined]0: "a"groups: undefinedindex: 0input: "asd"length: 1__proto__: Array(0)

    能夠看看返回的信息有些什麼?學習

    • 一個元素表明:總體匹配返回的結果,若是正則中有子組匹配,那麼會在index元素前返回,例如ui

      /(a)s/g.exec('afasg')  // 返回 ["as", "a", index: 2, input: "afasg", groups: undefined]
    • index就是匹配的索引位置信息
    • input就是目標字符串是什麼,
    • groups這邊返回undefined,由於正則中沒用到;它是返回自定義名字的子匹配信息,例如code

      /(?<groupone>a)s/g.exec('afasg')
      //返回  ["as", "a", index: 2, input: "afasg", groups: {groupone: "a"}]
  • 不經常使用的方法test,返回Boolean值,表示是否有匹配的字符串

正則的重要規則

比較全的規則,在這對象

我講講幾個比較重要的,經常使用的索引

  • 修飾符:i,m,g,y,修飾符之間能夠同時使用
    i就是忽略大小寫,例如驗證碼上的應用 => /a/i.test('A') //true
    m就是能識別換行,也就是能判斷出行末ip

    /a$/.test('a\nb')  //false 
    /a$/m.test('a\nb')  //true

    g是能進行連續的匹配,當匹配成功一次後還能繼續匹配直到沒有爲止,而且能夠經過lastIndex能夠查看下一次匹配的開始的索引可是隻對同一個正則有效,能連續指定,否則都是從零開始,這裏的同一個是指內存地址相等,不是內容相等就夠了

    const r = /a/g      //這裏經過變量r定義這樣用r進行後面的操做都會是用一個
    r.lastIndex         //0
    r.test('asdasd')    //true
    r.lastIndex         //1

    y通常和g連用,y的做用是必須從一開始就匹配上,否則就false;至關於加了個^

    /a/y.test('ba')  //false
    /a/y.test('ab')  //true ,通常和g連用,進行連續頭部匹配是否成功
  • \b,\B用於匹配是不是詞的邊界,不存在/wbw/它的意思就是是否存在一個是詞的邊,但前面又有一個w,明顯是不存在的(w等價於[A-Za-z0-9_])

    /\ba/g.test('ad') //true 
    /\ba/g.test('bad') //false
    /\ba/g.test('c-ad') //true  
    \B就是取反不是詞的邊界
  • [],()之間的區別,這兩個分紅經常使用
    []僅僅表明一個字符串,無論裏面寫多少規劃,最終仍是會去匹配一個字符串
    經常使用的有

    [xyz]   //表明匹配x或者y或者z
    [^]     //等價於[^''],任意字符串
    [\S\s]  //任意字符串   ,\s是匹配空格,換行(一些帶有空格的u碼,詳細能夠看連接) \S就是匹配除了\s意外的字符串

    ()是用於取子匹配的值,又叫元組;有時候咱們總體匹配上了,但又想在裏面取某個值就能夠加上個括號,結果中就會幫你返回,在將exec時以及提到了,這邊不舉例了
    能夠和字符串的replace方法一塊兒使用,進行負複雜的操做

    const r = /he(b)/g
    'afdhjbkhbgd'.replace(r, (match, $1) => {
        //match 是總體匹配的結果,$1是第一個元組返回值,當多個元組存在時是有外到裏的
        return xxxx
    })
  • .表明一個字符,除了空格,相似換行;還有一些大於大於0xFFFF的字符,他會認爲這是兩個字符,因此用於簡單的任意字符串匹配,可用.表明
  • 量詞
    a{n}能夠用來表明去匹配n個a,還能夠寫區間{1,3}匹配1到3個
    +,*,?這些事貪婪匹配的量詞,就是數量往大了取,不固定,但又範圍+ //[1, Infinity] * //[0, Infinity] ? //[0, 1]

    若是在其後面再添加個?就是非貪婪匹配了,取值就儘可能往小了取
    非貪婪匹配的做用在哪,能夠經過一個簡單的例子看一下

    //若是要匹配字符換'caabaaab' ,若是隻想取aab就會用到非貪婪匹配 經過/a+?b/g來匹配;用?來指定非貪婪匹配,加上b的限制,不會取到1;這邊用+仍是*是同樣的
  • 強大的斷言
    能夠理解成你是用於匹配的規則但不是我想要輸出的內容

    • 非捕獲組
      ?:表示;說直白點就是:仍是這麼匹配可是我不返回括號裏的內容,因此咱們進行split的組匹配時能夠進行修改console.log("abc".split(/(?:b)/)); //["a", "c"]
    • 先行斷言
      x(?=y)表示,意思是匹配一個x,x必須在y前面,結果中不返回y
    • 先行否認斷言
      x(?!y)表示,意思是匹配一個x,x後面不能是y,結果中不返回y
    • 後行斷言
      (?<=y)x表示,意思是匹配一個x,x前面必須是y,結果中不返回y
    • 後行否認斷言
      (?<!=y)x表示,意思是匹配一個x,x前面不能是y,結果中不返回y

      console.log(/(?<!=b)a/.exec("bcaba"));  //["a", index: 2, input: "bcaba", groups: undefined]
      console.log(/(?<=b)a/.exec("bcaba"));   //["a", index: 4, input: "bcaba", groups: undefined]

最重要最優先的規則

  • 優先選擇最左端的匹配結果
    能夠經過幾個例子自證一下

    /a+?b/.exec('baaabab')    
    //結果["aaab", index: 1, input: "baaabab", groups: undefined],由於先匹配上了aaab,因此忽略非貪婪原則不輸出ab或者b
    
    /a*?/.exec('baaa')
    //返回["", index: 0, input: "baaa", groups: undefined]  由於先匹配上了空串因此結果爲空串

常見的正則例子

  • 去除首尾空格 ' fds df '.replace(/^\s*|\s*$/g, '')
  • 去除首尾空格 ' fds df '.replace(/\s*(?=\S*)/g, '')
  • 千分位數字格式化 '1234567890'.replace(/\B(?=((\d{3})+$))/g, '.');
    若是有小數, ('1234567890.123').replace(/\B(?=((\d{3})+\.))/g, ',')
    合併二者: ('1234567890.213').replace(/\B(?=((\d{3})+(\.\d+)?$))/g, ',')

`

相關文章
相關標籤/搜索