zoukankan      html  css  js  c++  java
  • 正则表达式

    ##正则表达式(Regular Expression)

    ​ 1)正则的创建

    ​ 2)正则的匹配方法

    ​ 3)元字符

    ​ 4)字符集合

    ​ 5)边界

    ​ 6)分组

    7)反向引用

    ​ 8)数量词汇

    ​ 9)匹配模式

    -----

    ### 正则的创建

    - 字面量创建

     let str = "abc1231dfaf123213fda";
        let reg = /abc/g;
        let res = str.match(reg);
        console.log(res);

     正则表达式会默认为字符串

        let str = "1231dfaf123213fda";
        let abc = "1231"
        let reg = /abc/g;
        let res = str.match(reg);
        console.log(res);


    - 通过构造函数

     let str = "abc1231dfaf123213fda";
        let abc = "1231";
        let reg = new RegExp(abc,"g");
        let res = str.match(reg);
        console.log(res);
    特殊字符需要转义
        let reg = new RegExp("\d+","g");
     

    ### 正则的匹配方法

    字符串方法

    - match  

    - replace  替换

      let str = "abc11defghiej222k";
      let reg = /d/g;
      // console.log( str.replace(reg,"*") );

      let res =  str.replace(reg,function(arg){
          console.log(arg)
          return "*"
      })
      console.log(res);

    - search  返回全局匹配 ,始终返回 第一个找到的索引值,如果找不到返回-1 (indexOf)  

      let str = "abcdefghiejk";
      let reg = /e/g;
      let reg = /e/;
      console.log( str.search(reg) );

    - split  字符串分割 返回分割后的数组 可以通过正则分割也可以不通过

      let str = "abc123fda1234rt";
      let arr1 =  str.split(1); 
      let arr =  str.split(/d+/);  
      console.log(arr1)  ["abc", "23fda", "234rt"]
      console.log(arr)   ["abc", "fda", "rt"]

    正则对象下的方法

    - test  返回布尔值
    - exec 基于上次匹配的结果,进行匹配

    ### 元字符

    正则表达式中有特殊含义的非字母字符;

    ​ 1.字符类别(Character Classes)

      w W d D s S .

       ---- w :数字、字母、下划线;
        let str = "~123fdfs";
        let reg = /w+/g;
        console.log( reg.test(str));

       ---- W :非数字、字母、下划线;
         let str = "123fdfs";
         let reg = /W+/g;
            console.log( reg.test(str));
     
      ---- s :匹配空格;包括空格、制表符、换页符、换行符和其他 Unicode 空格
        let str = "abcfdsadfs";
        let reg = /s+/g;
        let reg = /S+/g;
        console.log( reg.test(str));

       ---- . : 非     u2028 u2029; 匹配行结束符( u2028 或 u2029)以外的任意单个字符
         let str = " ";
        let str = `afb`
        let reg = /a.b/;
        console.log( reg.test(str));
     

     2.数量相关

       {} ? + *;

       -----{}

        let str = "abceeeeeeeeeeeffd";
        let reg = /ce{3}f/g;
        let reg = /ce{1,4}f/g;  //从1次到4 可以看作一个闭区间
        let reg = /ce{1,}f/g    //至少出现一次
          console.log( reg.test(str) );

      -----? =====> {0,1} 
        let str = "123456789";
        let reg = /d{2,4}/g;     //会以4 最大值匹配  ---》贪婪匹配
        let reg = /d{2,4}?/g;   // 会以2最小值值匹配  ---》惰性匹配;
        let res =  str.match(reg);
        console.log(res)
           ----- + =====> {1,} 
        let str = "my name is lilei";
         let reg = /mys+name/g;
        console.log( reg.test(str));
      ------* =====> {0,};
     

     3.位置相关

       ^  $    B;
         let str = "abedef";
         let reg =/^w/g;
         let res =  str.replace(reg,"*");
         console.log(res);

        let str = "abedef";
        let reg =/w$/g;
        let res =  str.replace(reg,"*");
        console.log(res);

       ------:边界符; 边界: 非w 的 都是边界;
        // let str = "this is a book";
        // let reg = /is/g;
        // let res =  str.match(reg);
        // console.log(res);

      -----B 非边界;
        let str = "this is a book";
        let reg = /Bw{2}/g;
        let res =  str.match(reg);
        console.log(res);

     4.括号相关

       ()  []  {};
       -- ()
        -----分组;
         let str = "abababfdsafds";
         let reg = /(ab){3}/g;
         console.log(reg.test(str));

        ------提取值;
         let str = "2020-01-02";
         let reg = /(d{4})-(d{2})-(d{2})/;
         str.match(reg)
         console.log(RegExp.$1)
         console.log(RegExp.$2)
         console.log(RegExp.$3)

        -----替换;
         let str = "2020-01-02"; // 01/02/2020
         let reg = /(d{4})-(d{2})-(d{2})/;
        //let res =  str.replace(reg,"$2/$3/$1");
        let res =  str.replace(reg,function(arg,year,mouth,date){
             return mouth +"/" + date + "/" +year;
        });
         console.log(res)

        ------反向引用;
        let className = "news-container-nav"; //news_container_nav
        let reg = /w{4}(-|_)w{9}(1)w{3}/;
        let res =  reg.test(className);
        console.log(res);


        -- []:字符集合;
        let str = "My name is LiL1ei";
        /// let reg = /Li[Ll]ei/g;
        // // [a-z] [A-Z];  [a-Z]
        // // let reg = /[0-9]/g;
        // // console.log( reg.test(str));
        // let reg = /[^0-9]/g;
        // console.log( reg.test(str));
        // d [0-9]; w [a-zA-Z0-9_];
     
      --命名分组;
         let str = "2020-01-06";
         let reg = /(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/;
         console.log( str.match(reg));


      -- 零宽断言;
        -----正向零宽断言;
        let str = "iphone3iphone4iphone5iphonenumber";
     
          -----正向零宽断言--> 肯定
         // let reg = /iphone(?=d)/g;
         -----正向零宽断言-->否定
        // let reg = /iphone(?!d)/g;
        // let res = str.replace(reg,"苹果");
        // console.log(res);

         -----负向零宽断言;
        let str = '10px20px30pxipx';
           ------负向零宽断言-->肯定
          // let reg = /(?<=d+)px/g;
          ------负向零宽断言--> 否定
          let reg = /(?<!d+)px/g;
          let res =  str.replace(reg,"像素");
          console.log(res);

    ### 字符集合

    [xyz]

    - 一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符'-'指定一个范围
    - `[xyz]` 是一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符

    ### 边界

    - ^
    - 匹配输入开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处
    - $
    - 匹配输入结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处
    - 
    - 匹配一个零宽单词边界(zero-width word boundary)
    - B
    - 匹配一个非零宽单词边界(zero-width word boundary)

    ###分组

    - (子项)

    - 可以使用 () 对表达式进行分组,类似数学中分组,也称为子项
    - 索引分组
    - 命名分组
    - (?<name>...)
    - groups属性
    - 捕获匹配
    - 具有捕获(capturing)特性,即会把匹配结果保存到(子项结果)中
    - (x)
    - 非捕获匹配
    - 不具有捕获(capturing)特性,即不会把匹配结果保存到(子项结果)中
    - (?:x)
    - 零宽断言/预查(Assertions)
    - 用于指定查找在某些内容(但并不包括这些内容)之前或之后的内容
    - 正向零宽断言/预查
    - 肯定
    - (?=pattern)
    - 否定
    - (?!pattern)
    - 负向零宽断言/预查(注意:ES2018新增)
    - 肯定
    - (?<=pattern)
    - 否定
    - (?<!patten)
    - 捕获与零宽断言的区别
    - 捕获:匹配的内容出现在结果中但不出现在子项结果中
    - 零宽断言:完全不会出现在结果

    ### 反向引用

    -
    - 这里的 n 表示的是一个变量,值为一个数字,指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串

    ### 数量词汇

    - x{n}
    - n 是一个正整数。前面的模式 x 连续出现 n 次时匹配
    - x{n,m}
    - n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配
    - x{n,}
    - n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配
    - x*
    - 匹配前面的模式 x 0 或多次
    - x+
    - 匹配前面的模式 x 1 或多次。等价于 {1,}
    - x?
    - 匹配前面的模式 x 0 或 1 次
    - x|y
    - 匹配 x 或 y

    ### 匹配模式

    - g

    - global,全局模式:找到所有匹配,而不是在第一个匹配后停止
    - i

    - ignore,忽略大小写模式:匹配不区分大小写
    - m

    - multiple,多行模式:将开始和结束字符(^和$)视为在多行上工作,而不只是匹配整个输入字符串的最开始和最末尾处
    - s

    - dotAll / singleline模式:. 可以匹配换行符
    - u

    - unicode,unicode模式:匹配unicode字符集

    ```js
    console.log(/^.$/.test("uD842uDFB7"));
    console.log(/^.$/u.test("uD842uDFB7"));
    ```
    - y

    - sticky,粘性模式:匹配正则中lastIndex属性指定位置的字符,并且如果没有匹配也不尝试从任何后续的索引中进行匹配

    - 正则工具 http://regexper.com



  • 相关阅读:
    QT下载速度慢的解决方法
    第七章 多态
    第六章 重复运用class
    第五章 隐藏实现细节
    代码改变世界
    第四章 初始化和清理
    第三章 控制程序流程
    module.exports和exports
    如何与外部源交互
    实现POST服务器
  • 原文地址:https://www.cnblogs.com/x-yy/p/12906773.html
Copyright © 2011-2022 走看看