1. 程式人生 > >正則的理解

正則的理解

  元字元、量詞的合寫   

   /\d+/  至少有一個數字

  在字串中查詢與正則匹配的字元;

  n+案例 

  var st="heoollo"

  var reg=/o+/g  在字串中至少有一個o

  console.log(st.match(reg)) 結果為["oo","o"]

  n*案例

  var st="heoollo";

  var reg=/o*/g  在字串中匹配包含0個或多個o

  console.log(st.match(reg))  結果為["","","oo","","","o"];

  顯然這不是我們想要的結果;

  所以另一種寫法:在前面新增相鄰的字母 

  案例

  var st="heloollo"

  var reg=/lo*/g  匹配 l 之後帶0個或多個0的字元

  console.log(st.match(reg))  結果為["loo","l","lo"]

  n?

  var st="hellohlool"

  var reg=/lo?/g  包含 l 之後帶0個或1個o的字元

  console.log(st.match(reg))  結果為["l","lo","lo","l"];

  n{x}  x個n

  var st="helloohoo"

  var reg=/lo{2}/g  翻譯為:var reg=/loo/g

  console.log(st.match(reg));  結果為["loo"]

  ?=n  指定一個後面必須跟著n的字串,返回結果不帶n,使用過程中加()

  var st="hellohho"

  var reg=/h(?=o)/g  全域性匹配找一個h後面找o的h

  console.log(st.match(reg));  結果為["h"]

  /ln+/  l後面至少有一個n;

  /ln*/  l後面有0個或多個n;

  /ln?/  l後面有0個或1個n;

  /l(?=n)/  l後面緊跟著n,返回的是l,如果l後面沒有n,返回的是null;

  正則RegExp(類)

  概念:用來檢驗字串的規則;

  定義:通過這兩種方法定義一個正則;

    1.var reg=/格式/

    2.var reg=new RegExp

  其本質都是一個物件

  方法:

    1.test()  匹配的方法

    2.exec()  捕獲的方法

  修飾符: i  m  g

  [ ]

  元字元:

  量詞  (詳情見上一章)

  正則的理解:

  1.正則的懶惰性:

  2.正則的貪婪性;

  懶惰性;

    每一次在exec()中捕獲的時候,只捕獲第一次匹配的內容,而不往下捕獲了,我們把這種方式叫正則的懶惰性;

  捕獲開始的位置都是從0開始;

  解決正則的懶惰性

    修飾符:g 全域性匹配;

  案例:  

    var st="hello45612world12345"

    var reg=/\d+/g

    console.log(reg.exec(st));  結果為:45612  這就是正則的懶惰性,每次只輸出第一次匹配上的

    console.log(reg.exec(st));  結果為:12345  再次輸出的話,就發現他捕獲的位置從第一次輸出後就開始捕獲,不再從零捕獲(正是因為g的全域性捕獲)

    正則的例項物件reg有一個lastlndex的屬性,捕獲的起始位置;

    如何將捕獲的內容匯聚在一起:

    console.log(st.match(reg));  利用字元換中match的方法即可

  正則的貪婪性:

    正則每次捕獲都是按照最長的結果,我們把這種功能叫正則的貪婪性;

  案例:

    var st="hello12345"

    var reg=/\d+/g;

    console.log(reg.exec(st));  結果為["12345"]  只捕獲到最長的數字 不會是1,或1,2直接就是1,2,3,4,5

  怎樣處理正則的貪婪性:

    在元字元量詞的後面加?

    案例:

    var st="hello456121245"

    var reg=/\d+?/g

    console.log(st.match(reg))

  分組捕獲,正則裡面帶(),就是分組捕獲;

  /(a)(b)/  解析:外面一個大正則,裡面帶了兩個小正則;     (先算())

  分組捕獲的優點:1.可以改變優先順序;

          2.可以分組引用;

  分組引用\1,\2  \1代表和第一個分組出現的一模一樣,\2和第二個分組出現的一模一樣

  在數分組的個數時,從左往右;

  /(a)(b)/      (分組也是一個整體)

  第一組:(ab)

  第二組:(a)      

  第三組:(b)

  案例:

    var reg=/(\w)\1(\w)\2/

    var st="ssdd";

    console.log(reg.test(reg))  只有這樣才會返回true

  案例二:

    var reg=/(a)\1(b)\2/

    var st="aabb"

    console.log(reg.test(reg))  只用這樣才會返回true

    解析這種寫法的意思:

      第一個是分組,且是一個單詞字元,第二個是個分組引用,要求和第一組一模一樣,第三個是第二個分組且是一個單詞字元,第四個是一個分組引用,要求和第二組一模一樣

  分組捕獲:

    分組捕獲的前提是正則存在分組,不僅把大正則的內容捕獲到把小正則的內容捕獲到;

    案例:

      var st="absd";

      var reg=/(a)(b)/;

      console.log(reg.exec(st))  結果為["ab","a","b"]

  怎麼解除分組捕獲,如果你不想捕獲某一個分組的內容,在分組前面加一個?:就可以了;

    案例:

      var st="absd";

      var reg=/(a)(?:b)/

      console.log(reg.exec(st))  結果為["ab","a"]